2017-04-14 42 views
0

我有一个文本,我想用“?”替换所有“www.domain.com”。符号。用规则替换文本中的链接

www.domain.com DSA DSAD悲悲SA domain.com asdasds ADAS DSA www.domain.com/someurl/?d伤心sadsad www.domain.com/someurl/ ASD ASD SA www.domain .com?id = 123 sd asdsa d

因此,我正在使用preg_match_all()搜索文本,并查找所有没有“?”的链接。运行循环,当我运行str_replace()它一次替换所有的“domain.com”,即使是那个“?”并且在下一次迭代时,它将更多的“add_text”添加到替换的domain.com,所以我通过“domain.com?add_text?add_text”得到了情况等等。我有我想从PREG_OFFSET_CAPTURE取代文本的开始位置,但不知道它是否对我有帮助。 感谢

$post_content = 'www.domain.com dsa dsad sad sad sa 
domain.com asdasds adas dsa 
www.domain.com/someurl/?d sad sadsad 
www.domain.com/someurl/ asd asd sa 
www.domain.com?id=123 sd asdsa d'.'<hr>'; 

    $pattern = '#(www\.|https?:\/\/)?(domain.com)\S*#i'; 
       if($num_found = preg_match_all($pattern, $post_content, $out, PREG_OFFSET_CAPTURE)) 
       { 
        if ($num_found>0){ 
        foreach ($out[0] as $k => $v) { 
         if (strpos($v, '?') !== false) { 
          //skip 
         }else{ 
    //replace 
          $post_content = str_replace($v, $v.'?add_text, $post_content); 
         } 
        } 
        } 
       } 

输入:

www.domain.com DSA DSAD悲悲SA domain.com asdasds ADAS DSA www.domain.com/someurl/?d伤心sadsad WWW。 domain.com/someurl/ ASD ASD SA www.domain.com?id=123 SD asdsa d

预期输出:

www.domain.com?add_text DSA DSAD悲悲SA domain.com?add_text asdasds ADAS DSA www.domain.com/someurl/?d伤心sadsad www.domain.com/someurl/?add_text asd asd sa www.domain.com?id=123 sd asdsa d

所以每个URL都有一些get参数。没有“?”的每个网址(get)必须与?add_text相关,如果已经有某个东西就跳过它。

+0

能否请您分享您的输入和预期的输出? –

+0

@SahilGulati完成。谢谢。 – SERG

回答

1

您的方法存在根本上的缺陷,因为您在更换时没有考虑到子字符串。您可能最终会多次更换数据并损坏数据。尝试使用preg_replace()代替:

<?php 
$post_content = 'www.domain.com dsa dsad sad sad sa 
domain.com asdasds adas dsa 
www.domain.com/someurl/?d sad sadsad 
www.domain.com/someurl/ asd asd sa 
www.domain.com?id=123 sd asdsa d'.'<hr>'; 
$pattern = '/((?:https?:\/\/)?(?:www\.)?domain\.com(?!\S*\?))(\S*)/im'; 
$post_content = preg_replace($pattern, "$1$2?add_text", $post_content); 
echo $post_content; 

正则表达式变得有些复杂,与式断言检查没有问号。 The breakdown is here

+0

非常感谢! – SERG

2

PHP code demo

正则表达式:((?:https?:\/\/)?(?:www\.)?[a-zA-Z]+\.com)(?!\/|\?)|(?:https?:\/\/)?(www\.?[a-zA-Z]+.com\/(?:[^\/]+\/)*)

((?:https?:\/\/)?(?:www\.)?[a-zA-Z]+\.com)(?!\/|\?)

这将匹配EG。 http://www.something.comhttps://www.something.com不再进一步?/

((?:https?:\/\/)?www\.?[a-zA-Z]+.com\/(?:[^\/]+\/)*)

这将匹配EG。http://www.something.com/some/urlhttps://www.something.com/some/url

<?php 
$string='www.domain.com dsa dsad sad sad sa domain.com asdasds adas dsa www.domain.com/someurl/?d sad sadsad www.domain.com/someurl/ asd asd sa www.domain.com?id=123 sd asdsa d'; 
echo preg_replace("/((?:www\.)?[a-zA-Z]+\.com)(?!\/|\?)|(www\.?[a-zA-Z]+.com\/(?:[^\/]+\/)*)/", "$1$2?add_text", $string); 
+0

原始数据是多行的,OP正则表达式也在检查'http://'。看起来不错,否则 – miken32

+0

谢谢@ miken32 ...:D添加http以及。 –

+0

非常感谢! – SERG