PHP - Birden maçları ile preg_replace

5 Cevap php

Diyelim ki gibi bir dize var diyelim:

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

I want to convert it to: %ITEM:1a2b3xxx%ITEM:4c5d6

İşte bende ne:

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

Arama açgözlü olduğu gibi bu oldukça doğru değildir.

Düşünceler?

Teşekkürler!

5 Cevap

Bu deneyin:

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

NOT: denenmemiş

?.. Ne yaptım * için * değiştirmek oldu, ve (ben bunun bir hata olmuş olabileceğini düşündüm; üzgünüm ki doğru değil ise) nesne etiketi kapatmak için. ? sonra. * tembel yapmalıdır.

Peki neden böyle smth yapamaz:

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

Ya da bunun gibi:

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

NOT: Test =)

It "" her örneğinde dize bölmek daha kolay olmaz mıydı?

$result = '';
$items = explode('<object>', $text);
foreach ($items as $item){
  $result .= '%'.str_replace('</object>', '', $item);
}
echo $result;

Yanında parantez için $2 kullanın.

Biz * kullanılarak olmayan açgözlü arama yapabilir? * yerine. Yani nihai regex olur:

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

Yerine metinde gelmesini önlemek amacıyla ben de regex sonunda '>' ekledik.