preg_replace
これは、2 つのパターンと 2 つの置換を使用して実現できます。
<?php
$add = "utm=some&medium=stuff";
$patterns = array(
'/(https?:\/\/(?:www)?me\.com(?=.*?\?)[^"]*)/', # positive lookahead to check if there is a ? mark in url
'/(https?:\/\/(?:www)?me\.com(?!.*?\?)[^"]*)/' # negative lookahead to check if ? mark is not in
);
$replacements = array(
"$1&".$add, # replacement if first pattern take place
'$1?'.$add # replacement if second pattern take place
);
$str = 'Lorem ipsum <a href="http://www.me.com">dolor sit</a> amet, <a href="http://www.me.com/page.php?id=10">consectetur</a> elit.';
$str = preg_replace($patterns, $replacements, $str);
echo $str;
/* Output:
Lorem ipsum <a href="http://www.me.com&utm=some&medium=stuff">dolor sit</a> amet, <a href="http://www.me.com/page.php?id=10&utm=some&medium=stuff">consectetur</a> elit.
*/
?>
DOM ソリューションを使用した他の回答が気に入ったので、各スニペットが次の入力にかかる時間をテストしました。
<a href="http://www.me.com">Lorem</a>
<a href="http://www.me.com/">ipsum</a>
<a href="http://www.me.com/#section-2">dolor</a>
<a href="http://www.me.com/path-to-somewhere/file.php">sit</a>
<a href="http://www.me.com/?">amet</a>,
<a href="http://www.me.com/?foo=bar">consectetur</a>
<a href="http://www.me.com/?foo=bar#section-3">elit</a>.
とmicrotime
:
$ts = microtime(true);
// codes
printf("%.10f\n", microtime(true) - $ts);
以下でそれらを見ることができます(ミリ秒):
@squeamish ossifrage: 0.0001089573
@Cobra_Fast: 0.0003509521
@Emissary: 0.0094890594
@Me: 0.0000669956
それは私にとって興味深いものでしRegEx
た。