PHP - preg_replace с несколькими совпадениями - PullRequest
0 голосов
/ 18 декабря 2009

Допустим, у меня есть строка вроде:

$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);

Это не совсем верно, так как поиск жадный.

Мысли

Спасибо!

Ответы [ 5 ]

2 голосов
/ 18 декабря 2009

Попробуйте это:

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

ПРИМЕЧАНИЕ: не проверено

Что я сделал, так это изменил. * На. *? И закрыл твой объектный тег (я подумал, что это могло быть ошибкой; извините, если это не правильно). ? после. * должен сделать это ленивым.

1 голос
/ 18 декабря 2009

Так почему бы не сделать что-то вроде этого:

$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);

ПРИМЕЧАНИЕ: проверено =)

0 голосов
/ 18 декабря 2009

Не проще ли разбить строку на каждый экземпляр ""?

$result = '';
$items = explode('<object>', $text);
foreach ($items as $item){
  $result .= '%'.str_replace('</object>', '', $item);
}
echo $result;
0 голосов
/ 18 декабря 2009

Мы можем сделать поиск не жадным, используя *? на месте *. Таким образом, последнее регулярное выражение становится:

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

Я также добавил '>' в конце регулярного выражения, чтобы избежать его появления в замененном тексте.

0 голосов
/ 18 декабря 2009

Используйте $2 для следующих скобок.

...