0

次のような文字列があるとします。

$text = "<object>item_id1a2b3</object>xxx<object>item_id4c5d6</object>"

次のように変換したい: %ITEM:1a2b3xxx%ITEM:4c5d6

これが私が持っているものです:

$text = preg_replace("/<object.*item_id([a-zA-Z0-9]+).*<\/object/","%ITEM:$1",$text);

検索は貪欲であるため、これは正しくありません。

考え?

ありがとう!

4

5 に答える 5

2

これを試して:

$text = preg_replace("/<object>.*?item_id([a-zA-Z0-9]+).*?<\/object/","%ITEM:$1",$text);

注: 未テスト

私がしたことは、.* を .*? に変更し、オブジェクト タグを閉じることでした (間違いだったのではないかと思いました。正しくない場合は申し訳ありません)。? .* の後に遅延させる必要があります。

于 2009-12-18T04:58:59.797 に答える
2

*? を使用して検索を非貪欲にすることができます。代わりに *。したがって、最終的な正規表現は次のようになります。

$text = preg_replace("/<object.*?item_id([a-zA-Z0-9]+).*?<\/object>/","%ITEM:$1",$text);

また、置換されたテキストに含まれないように、正規表現の最後に「>」を追加しました。

于 2009-12-18T05:06:05.570 に答える
1

それでは、次のようにしてください。

$text = preg_replace("@<object>item_id([a-zA-Z0-9]+)</object>@", "%ITEM:$1", $text);

またはこのように:

$text = preg_replace("@<object>item_id@", "%ITEM:", $text);
$text = preg_replace("@</object>@", "", $text);

注: テスト済み =)

于 2009-12-18T05:31:55.740 に答える
0

$2次の括弧に使用します。

于 2009-12-18T04:58:53.467 に答える
0

「」のすべてのインスタンスで文字列を分割する方が簡単ではないでしょうか?

$result = '';
$items = explode('<object>', $text);
foreach ($items as $item){
  $result .= '%'.str_replace('</object>', '', $item);
}
echo $result;
于 2009-12-18T17:39:01.790 に答える