我有一个文字,我想要更换所有“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,如果已经存在,那么只需跳过它。
答案 0 :(得分:2)
正则表达式: Future.get()
((?:https?:\/\/)?(?:www\.)?[a-zA-Z]+\.com)(?!\/|\?)|(?:https?:\/\/)?(www\.?[a-zA-Z]+.com\/(?:[^\/]+\/)*)
这将与Eg匹配。 http://www.something.com或https://www.something.com不再((?:https?:\/\/)?(?:www\.)?[a-zA-Z]+\.com)(?!\/|\?)
和?
。
/
这将与Eg匹配。 http://www.something.com/some/url或https://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