按规则替换文本中的链接

时间:2017-04-14 05:38:24

标签: php regex string str-replace preg-match-all

我有一个文字,我想要更换所有“www.domain.com”而不是“?”符号

  

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

所以我使用preg_match_all()搜索文本,找到没有“?”的所有链接。运行循环,当我运行str_replace()时,它会一次替换所有“domain.com”,即使是“?”并且在下一次迭代中,它会为替换的domain.com添加更多“add_text”,因此我得到“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 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

预期输出:

  

www.domain.com?add_text dsa dsad sad sad sa domain.com?add_text   asdasds adas dsa www.domain.com/someurl/?d sad sadsad   www.domain.com/someurl/?add_text asd asd sa www.domain.com?id=123 sd   asdsa d

所以每个URL都有一些get param。每个网址没有“?” (get)必须使用?add_text,如果已经存在,那么只需跳过它。

2 个答案:

答案 0 :(得分:2)

PHP code demo

正则表达式: Future.get()

((?: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

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

答案 1 :(得分: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