PHP ereg_replace sorular

4 Cevap php

PHP ereg_replace sorular bir çift. Ben isimleri bir dizi var:

$ssKeywords = array("Str", "Int", "String", "As", "Integer", "Variant");

Ben bu ereg_replace kullandığınızda Ancak zaman:

foreach($arKeyword as $aWord) {
  $sCode = ereg_replace($aWord, "<span class='ssKeyword'>".$aWord."</span>", $sCode);
}

Sadece "str" ​​veya "int" değil tam maç bulabilirsiniz. Görünüşe göre ereg_replace açgözlü olduğunu, bu yüzden neden tam eşleşme arıyor değil mi?

Ben preg_replace kullanarak çalışma yorumlarınızı başardı.

4 Cevap

Eğer Ereg kullanmak gerekir mi? o. Ben de daha verimli olan, sen gebelik kullanmanızı öneririz onaylanmaz ve PHP 6 olarak eskimiş olacak.

Bu bilgiler php.net / ereg mevcuttur

Bunun yerine bir seferde bir dönem için arama daha iyi bir seferde hepsini arayın:

$sCode = preg_replace('/(?:'.implode('|', array_map('preg_quote', $ssKeywords)).')/', '<span class="ssKeyword">$0</span>', $sCode);

Onun uzunluğu ile koşullarını sıralamak Ve eğer, Integer yerine bulacaksınız sadece Int:

usort($ssKeywords, create_function('$a,$b', 'return strlen($b)-strlen($a);'));

Senin sorunun ereg_replace ile hiçbir alakası yoktur. Sadece preg_replace daha iyi bir bahistir, ama aslında sizin durumunuzda düzenli ifadeler herhangi bir türünü kullanarak değil; Eğer sadece düz bir dize maç yapıyoruz. Yani str_replace daha hızlı ve daha net olacaktır.

Sorun yapıyoruz olduğunu:

foreach($arKeyword as $aWord) {

yani onları ilan sırayla anahtar kelimelerin her biri karşı tüm dizeyi test, dizinin son elemanına ilk döngüler. Sen ilan döngü kadar 'Integer' anahtar kelime olarak alır önce 'Int' ilk, böylece dize herhangi bir 'Integer' " Int Eger" yerini alacak. Hangi zaman, ile "" şekilde, bu maç asla.

Uzun anahtar kelimeler ilk gelen ve bu iş olacak ki dizi sırasını değiştirin.

Eğer düz metin maçı yapıyorsanız o zaman str_replace daha verimli ve daha az gereksiz. Eğer düzenli ifadeler gelecekte herhangi bir zamana ihtiyacın varsa ereg_* önerilmiyor ve preg_* hızlı olduğu için, preg_* işlevlerini kullanın.

"Açgözlü" hakkında soruya gelince, bu aslında normal ifadeler kullanarak olduğunuzda anlamına gelir. Eğer metin varsa, örneğin:

Hello World! Hello World!

Ve böyle bir regex kullanabilirsiniz:

/Hell(.+)rld!/

+ Operatörü açgözlü ve tek satıra kadar olabildiğince bulur, çünkü o tüm dizeyi maç olacak. Bunu açgözlü olma durdurmak ve ifadelerin her maç için bunu yapmak gerekir:

/Hell(.+?)rld!/