只匹配reges里面的href =“http

时间:2016-06-10 10:09:10

标签: php regex

我正在使用以下正则表达式选择一个不包含AMP的网址中的href="http部分:

rel="nofollow"

事情是它只替换了preg_replace( "/<a\b(?=[^>]+\b(href=\"http))(?![^>]+\brel=\"nofollow\")/', "rel=\"nofollow\" href=\"http://", $input_string ); ,因为那是第一场比赛。

如何选择a标记但从结果中排除<a部分,以便它只匹配<a?由于href="http确实返回preg_match<a,但我只需要href="http:)

我认为这可能是唯一正确的解决方案的原因是因为它不确定给定字符串包含多少href="http个标记以及它们是否包含<a>。我需要确保仅将rel=nofollow替换为http://rel="nofollow" http://内的<a>代码,而不是rel="nofollow"

编辑1:

giuseppe straziota要求输入和输出示例,所以这里是:

输入:

this is a string with a lot of content and <a href="http://information.nl" class="aClass">links</a> and whatever....

输出:

this is a string with a lot of content and <a rel="nofollow" href="http://information.nl" class="aClass">links</a> and whatever....

编辑2:

我进行了几次测试,结果如下:

代码(完全复制/粘贴):

$input_string = 'this is a string with a lot of content and <a href="http://information.nl" class="aClass">links</a> and whatever....';

$input_string = preg_replace(
    '/<a\b(?=[^>]+\b(href="http))(?![^>]+\brel="nofollow")/', 
    'rel="nofollow" href="http://', 
    $input_string
);

echo htmlentities($input_string);

来自php 7.0.5的结果:

this is a string with a lot of content and rel="nofollow" href="http:// href="http://information.nl" class="aClass">links</a> and whatever....

它应该是:

this is a string with a lot of content and <a rel="nofollow" href="http://information.nl" class="aClass">links</a> and whatever....

编辑3:

我试过这个正则表达式:

$test = preg_replace(
    '/(?=<a\b[^>]+\b(href="http))(?![^>]+\brel="nofollow")/', 
    'rel="nofollow" href="http://', 
    $input_string
);

但现在它将'rel="nofollow" href="http://'放在<a之前,结果是:

rel="nofollow" href="http://<a href="http://information.nl" class="aClass">links</a>

不完全是我想要的......

1 个答案:

答案 0 :(得分:1)

我认为太难了,我在preg_replace中做了一些调整,所以我可以使用第一个正则表达式:

$test = preg_replace(
    '/<a(?=\b[^>]+\b(href="http))(?![^>]+\brel="nofollow")/', 
    '<a rel="nofollow"', 
    $input_string
);

它取代了<a标签,所以我应该像现在一样利用它。