1

を含む大きな文字列と、mysite/tim/here-is-something.htmlなどの他のURLパターンがありmysite/a/some-thing.htmlます。今、私は最初のパターンのすべてを変更し-+他のすべてのパターンをそのままにしておきたいです。

誰もがこれに対処する方法を知っていますか?

提案ありがとうございます!

4

2 に答える 2

0
$pattern = '!((mysite/tim/)[-\w\.]*)+(?=((mysite/a/)+)|(\s+|\n))!';
$html = 'mysite/tim/here-is-something.html   mysite/tim/here-is-something.html  mysite/a/here-is-something.html mysite/tim/here-is-som-ething.html  mysite/a/here-is-something.html mysite/tim/he-re-is-so-m-eth-ing.html  mysite/a/here-is-something.html  mysite/a/here-is-something.html mysite/tim/here-is-something.html  mysite/tim/here-is-something.html 
mysite/tim/here-is-something.html ';
preg_match_all($pattern,$html, $match);
//print_r($match);
foreach ($match[0] as $value) {
    $modified_value=str_replace("-","+", $value);
    $html=str_replace($value,$modified_value,$html);
}
print_r ($html);

出力:

mysite/tim/here+is+something.html mysite/tim/here+is+something.html mysite/a/here-is-something.html mysite/tim/here+is+som+ething.html mysite/a/here-is-something.html mysite/tim/he+re+is+so+m+eth+ing.html mysite/a/here-is-something.html mysite/a/here-is-something.html mysite/tim/here+is+something.html mysite/tim/here+is+something.html mysite/tim/here+is+something.html

見つかった一致:

match[0] => Array
        (
            [0] => mysite/tim/here-is-something.html
            [1] => mysite/tim/here-is-something.html
            [2] => mysite/tim/here-is-som-ething.html
            [3] => mysite/tim/he-re-is-so-m-eth-ing.html
            [4] => mysite/tim/here-is-something.html
            [5] => mysite/tim/here-is-something.html
            [6] => mysite/tim/here-is-something.html
        )
于 2012-07-19T14:10:11.600 に答える
0

すでに解決したように聞こえますが、問題はpreg_matchとstr_replaceにきちんと分割されています。preg_matchは、説明したように要素を配列にロードするよりも柔軟性がありますが、その動作を理解するには正規表現の知識も必要です。

preg_replaceは、柔軟な長さのポジティブルックビハインドを処理できないため、この結果を1つのステップで達成するために使用することはできません。1回のオカレンスを置き換えることはできますが、複数回のオカレンスを置き換えることはできません(whileループに入れられない限り、これは別のオプションになります)。

<?
$strings = array("mysite/tim/here-is-something.html",
                 "mysite/a/some-thing.html");

foreach ($strings as $string) {
  if (preg_match("#^(mysite/tim/)(.*)#",$string,$matches)) {
    print "Changed string: $string\nto: ";
    print $matches[1].str_replace("-","+",$matches[2])."\n";
  } else {
    print "Didn't change string: $string\n";
  }
}

出力:

Changed string: mysite/tim/here-is-something.html
to: mysite/tim/here+is+something.html
Didn't change string: mysite/a/some-thing.html
于 2012-06-27T23:58:04.820 に答える