PHP ereg_replace Вопросы - PullRequest
       11

PHP ereg_replace Вопросы

1 голос
/ 01 сентября 2009

Пара вопросов PHP ereg_replace. У меня есть массив имен:

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

Однако, когда я использую этот ereg_replace:

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

Он найдет только "str" ​​или "int", а не полное совпадение. Очевидно, что ereg_replace является жадным, так почему он не ищет полного соответствия?

Мне удалось заставить комментарии работать, используя preg_replace.

Ответы [ 4 ]

3 голосов
/ 01 сентября 2009

Вместо поиска по одному термину за раз лучше искать все из них одновременно:

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

И если вы отсортируете термины по их длине, вы найдете Integer вместо просто Int :

usort($ssKeywords, create_function('$a,$b', 'return strlen($b)-strlen($a);'));
3 голосов
/ 01 сентября 2009

Ваша проблема не имеет ничего общего с ereg_replace. Preg_replace не только лучше, но на самом деле в вашем случае вы не используете регулярные выражения; вы просто делаете простое совпадение строк. Так что str_replace будет быстрее и понятнее.

Проблема в том, что вы делаете:

foreach($arKeyword as $aWord) {

, который переходит от первого к последнему элементу массива, проверяя всю строку по каждому ключевому слову в том порядке, в котором вы их объявили. Сначала вы объявили «Int», поэтому любое «Integer» в строке будет заменено на « Int eger», прежде чем цикл достигнет ключевого слова «Integer». К тому времени, когда «» в пути, оно никогда не совпадет.

Измените порядок массива так, чтобы длинные ключевые слова были на первом месте, и это сработало.

3 голосов
/ 01 сентября 2009

Вам нужно использовать Ereg? он устарел и устарел с PHP 6. Я предлагаю вам использовать preg, который также более эффективен.

Эта информация доступна на php.net/ereg

.
0 голосов
/ 01 сентября 2009

Если вы выполняете простое сопоставление текста, то str_replace более эффективен и не требует лишних усилий. Если в будущем вам понадобятся регулярные выражения, используйте функции preg_*, поскольку ereg_* устарело, а preg_* быстрее.

Что касается вашего вопроса о «жадности», то есть о том, когда вы на самом деле используете регулярные выражения. Например, если у вас есть текст:

Hello World! Hello World!

И используйте регулярное выражение, как это:

/Hell(.+)rld!/

Тогда он будет соответствовать всей строке, потому что оператор + является жадным и находит столько, сколько может в одной строке. Вам нужно будет сделать это, чтобы перестать быть жадным и соответствовать каждой фразе:

/Hell(.+?)rld!/
...