好,所以我有一个字符串(这是电子邮件的内容),我需要在该字符串上存在的任何URL后面附加一个变量。 我们可以认为所有URL都在锚标记的href属性之内 因此,我想搜索 href =“任何内容的任何出现,并将其替换为 href =”任何内容?myvar“ 。 理想情况下,我还要检查链接中是否已包含任何var,以便将其附加“&myvar”而不是“?myvar”。
我有类似的东西,但是我对正则表达式感到迷惑。
$compileProvider
这不起作用,因为它是在将href属性后的双引号后附加我的变量...
对不起,我对正则表达式感到很遗憾。任何帮助将不胜感激!
答案 0 :(得分:0)
您可以尝试一下,该方法适用于我提供的测试数据。
<?
$text = '<a href="http://whatever">whatever</a> <a href=\'http://whatever?somevar=1\'>something</a>';
$pattern1 = '/([\'"])(https?:\/\/[^\1?]+)\1/';
$pattern2 = '/([\'"])(https?:\/\/[^\1]+\?[^\1]+)\1/';
$html_links = preg_replace($pattern2, '$1$2&myvar$1', $text);
$html_links = preg_replace($pattern1, '$1$2?myvar$1', $html_links);
var_dump($html_links);
说明:
$pattern1 = '/([\'"])(https?:\/\/[^\1?]+)\1/';
([\'"])
引号
(https?:\/\/[^\1?]+)
http后跟一个可选的s,然后是as 直到匹配的引号为止
\1
结束引用反向引用
$pattern2 = '/([\'"])(https?:\/\/[^\1]+\?[^\1]+)\1/';
(https?:\/\/[^\1]+\?[^\1]+)
如上所述,但需要一个?
答案 1 :(得分:0)
通常,使用正则表达式解析任何类型的HTML (here is why)都是一个坏主意。最好使用Dom parser中的PHP构建。这是您的操作方法:
//SET YOUR variable
$myvar='MYVAR=I WANT BEER';
//GET THE DOM
$dom = new DOMDocument('1.0','UTF-8');
$iEr = libxml_use_internal_errors(true);
$dom->loadHTML($text);
libxml_use_internal_errors($iEr);
//LOOK FOR <A HREFS=
foreach ($dom->getElementsByTagName('a') as $node) {
if($node->hasAttribute('href')){
$href=$node->getAttribute('href');
//look for query parts
$query = parse_url($href, PHP_URL_QUERY);
//if no query part, add ?
if($query===NULL) $new_link = $href.'?';
// if there is a query part, add &
else $new_link = $href.'&';
//add your own variable
$new_link.=$myvar;
//replace the old link with the new one
$node->setAttribute('href',$new_link);
}
}
//SAVE THE NEW DOM
$new_text=$dom->saveHtml();
关于为什么使用libxml_use_internal_errors
,take a look here