1

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

4 に答える 4

3

あなたの問題は ereg_replace とは関係ありません。preg_replace がより良い賭けであるだけでなく、実際、あなたの場合、どのタイプの正規表現も使用していません。単純な文字列の一致を行っているだけです。したがって、str_replaceはより迅速かつ明確になります。

問題は、あなたがやっているということです:

foreach($arKeyword as $aWord) {

配列の最初の要素から最後の要素までループし、宣言した順序で各キーワードに対して文字列全体をテストします。最初に 'Int' を宣言したため、ループが 'Integer' キーワードに到達する前に、文字列内のすべての 'Integer' が「<span class="ssKeyword">Int</span>eger」に置き換えられます。その頃には「</span>」が邪魔で、絶対に一致しません。

配列の順序を変更して、長いキーワードが最初に来るようにします。

于 2009-09-01T14:10:06.803 に答える
3

eregを使用する必要がありますか?これは非推奨であり、PHP 6 で廃止される予定です。より効率的な preg を使用することをお勧めします。

この情報は、php.net/ereg で入手できます。

于 2009-09-01T13:52:04.597 に答える
3

一度に 1 つの用語を検索する代わりに、一度にすべての用語を検索することをお勧めします。

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

用語を長さで並べ替えると、IntだけでなくIntegerが見つかります。

usort($ssKeywords, create_function('$a,$b', 'return strlen($b)-strlen($a);'));
于 2009-09-01T13:55:14.357 に答える
0

プレーンテキストの一致を行っている場合str_replaceは、より効率的で不必要ではありません。将来的に正規表現が必要になった場合は、非推奨で高速なpreg_*関数を使用してください。ereg_*preg_*

「貪欲」についての質問に関しては、それは実際に正規表現を使用している場合を指します。たとえば、次のテキストがある場合:

Hello World! Hello World!

そして、次のような正規表現を使用します。

/Hell(.+)rld!/

次に、+ 演算子は貪欲で、1 行で可能な限り多くを検索するため、文字列全体に一致します。貪欲になるのを止めて、各フレーズに一致させるには、次のようにする必要があります。

/Hell(.+?)rld!/
于 2009-09-01T14:22:51.120 に答える