4

私はphpのpreg_replace().

基本的に、一致する文字列には2つの可能性があります。

  1. ハローリアルワールド
  2. ご挨拶

これが私が達成したいことです:

  1. Hello </span>Real World
  2. Gree</span>tings

ルールの説明: 文字列にスペースが含まれている場合は</span>、最初のスペース文字の直後に挿入します。文字列にスペース (単語) が含まれていない場合は、文字列</span>の真ん中 (文字数が奇数の場合は +/-) に挿入します。

これまでのところ、私は長い間機能する解決策を思いつきました:

<?php 
$str = "Hello Real World";
echo preg_match("/ /", $str) ? preg_replace("/ /", " </span>", $str, 1) : preg_replace("/.{" . round(strlen($str)/2) . "}/", "$0</span>", $str, 1);
?>

preg_replace()ただし、1回の呼び出しだけで、はるかに短くてエレガントな正規表現で実現できると思います。

単一の preg_replace() 呼び出しだけでそれを行う方法はありますか? 例えば:

preg_replace("/ |.{" . round(strlen($str)/2) . "}/", "$0</span>", $str, 1)
4

2 に答える 2

3

正規表現エンジンは、文字列にスペースがあるかどうかを事前に知りません。複数の関数が必要ですが、これを行うために正規表現はまったく必要ありません。

$pos = strpos($str, ' ');
if ($pos === false) {
   //No space found
   $pos = intval(strlen($str) / 2);
}
else {
   //we want to insert *after* the space
   $pos++;
}
$str = substr_replace($str, '</span>', $pos, 0);
于 2012-12-05T15:12:40.083 に答える
0

いいえ、あなたが考えていることを実行するための短くてエレガントな方法はありません。正規表現は、文字列に対して無制限の機能を実行できる魔法のツールではありません。

私が提案することの1つは、スペースを見つけるために正規表現を必要としないため、どこでも正規表現を使用しないことです。

echo strpos( ' ', $str ) === FALSE
    ? str_replace ( ' ', '</span>', $str, 1 ) /* Only replace 1 occurrence */
    : preg_replace("/.{" . round(strlen($str)/2) . "}/", "$0</span>", $str, 1);

のドキュメントのstr_replaceように、「(正規表現のような)手の込んだ置換ルールが必要ない場合は、常に preg_replace() の代わりにこの関数を使用する必要があります。

于 2012-12-05T15:14:23.467 に答える