替换不包含查询字符串的文本中的所有链接(PHP)

时间:2013-11-19 14:19:22

标签: php regex string

我想替换(以及更改)文本块中没有查询字符串和手动查询字符串的所有youtube链接。

例如,文本代码可能如下所示:

http://youtube.com/embed/ABC
http://youtube.com/embed/DEF?foo=bar
http://youtube.com/embed/EFG

我希望它看起来像:

http://youtube.com/embed/ABC?sup=bro
http://youtube.com/embed/DEF?foo=bar
http://youtube.com/embed/EFG?sup=bro

使用PHP实现这一目标的最佳方法是什么?

4 个答案:

答案 0 :(得分:1)

只需检查:

  • 没有?^([^?]+)$
  • 查询字符串为空,\?$
$links = array(
    'http://youtube.com/embed/ABC',
    'http://youtube.com/embed/DEF?foo=bar',
    'http://youtube.com/embed/EFG',
    'http://youtube.com/embed/HIJ?',
);

$nlinks = preg_replace('/^([^?]+)$|\?$/', '$1?sup=bro', $links);

var_dump($nlinks);
/*
* array(3) { 
*     [0]=> string(36) "http://youtube.com/embed/ABC?sup=bro" 
*     [1]=> string(36) "http://youtube.com/embed/DEF?foo=bar" 
*     [2]=> string(36) "http://youtube.com/embed/EFG?sup=bro" 
*     [2]=> string(36) "http://youtube.com/embed/HIJ?sup=bro" 
* }
*/

修改
我为具有空查询字符串的网址添加了一个案例,例如http://youtube.com/embed/HIJ?

答案 1 :(得分:1)

没有正则表达式的解决方案。将所有URL都放入数组中,使用parse_url()获取查询字符串部分(如果存在)并将自定义$query附加到循环中。

$query = 'sup=bro'; // define this

foreach($urls as &$url) {
    $parts = parse_url($url);
    if (!isset($parts['query'])) {
        $url .= '?' . $query;
    }
}

print_r($urls);

输出:

Array
(
    [0] => http://youtube.com/embed/ABC?sup=bro
    [1] => http://youtube.com/embed/DEF?foo=bar
    [2] => http://youtube.com/embed/EFG?sup=bro
)

Demo.

答案 2 :(得分:0)

我认为您需要使用 preg_match 检查字符串。如果您在"?"之后有剩余部分,请保持原样;否则,添加" sup = bro"。

答案 3 :(得分:0)

您可以使用此模式:

$urls = <<<LOD
http://youtube.com/embed/ABC
http://youtube.com/embed/DEF?foo=bar
http://youtube.com/embed/EFG
LOD;

$urls = preg_replace('~/[^/?\s]*\K$~m', '?sup=bro', $urls);