使用正则表达式从字符串中修剪/删除/删除链接

时间:2011-09-21 19:55:21

标签: php regex string

我有一个非常简单的问题,......给了我一个hedache ......

我只想修剪所有链接(www.link.com)(http://www.link.com)(http://link.com)... wathever,来自这个正则表达式的给定字符串:

$regex = "(http|ftp|https):\/\/[\w\-_]+(\.[\w\-_]+)+([\w\-\.,@?^=%&:/~\+#]*[\w\-\@?^=%&/~\+#])?";

只需在空白处转动它们。

这是我的实际代码无法正常工作......

<?php

$string = 'ads dsa asd asd as da ds www.something.com adss dsad a sdas d';
$pattern = "(http|ftp|https):\/\/[\w\-_]+(\.[\w\-_]+)+([\w\-\.,@?^=%&amp;/~\+#]*[\w\-\@?^=%&amp;/~\+#])?";

$replacement = ' nothing ';
echo preg_replace($pattern, $replacement, $string);

?>

它一直在说我

    ( ! ) Warning: preg_replace() [function.preg-replace]: Unknown modifier ':' in C:\wamp\www\ceva.php on line 9
    Call Stack
    #   Time    Memory  Function    Location
    1   0.0005  363504  {main}( )   ..\ceva.php:0
    2   0.0005  363952  preg_replace ( )    ..\ceva.php:9

任何帮助将不胜感激:D

4 个答案:

答案 0 :(得分:2)

php中正则表达式的模式需要用分隔符包围,以显示模式的开始和停止位置以及修饰符(不区分大小写,多行...等)的开始。最常见的是,您会看到正斜杠作为分隔符,但大多数角色都可以使用。示例模式可能是:/pattern[a-z]*/i。请注意,第一个字符是正斜杠(/),模式本身以相同的字符(/)结尾,之后只有i的修饰符,不区分大小写。等(见:pattern modifiers)。无论第一个字符是什么,分隔符和模式部分必须以与结束分隔符相同的字符结尾。你看到的错误意味着你的第一个字符是一个开括号,是分隔符。在下一个打开括号之后,之后的所有内容都应该是修饰符。错误是在结束分隔符后面有一个无效的修饰符。要解决这个问题,你应该能够在正则表达式周围放置一个分隔符,它应该可以工作。请参阅Delimeters以及php regular expressions的一般参考。

编辑: 我想知道你为什么得到关于冒号作为问题角色的错误。显然,php还支持括号样式分隔符,例如{}。使用左括号作为分隔符,右括号是结束分隔符。预期以下字符是分隔符,并且当关闭分隔符后面的第一个字符时,模式会抛出错误,因为它是无效的修饰符,所以会到达冒号。 TIL。

答案 1 :(得分:0)

看起来它对冒号不满意。尝试使用反斜杠转义正则表达式中的反斜杠(将“:”转换为“\:”。

答案 2 :(得分:0)

这非常简单,但可能就够了,它只是假设链接后有空格

<?php
    $string = 'here goes 1 http://google.com and 2 http://www.google.com and also 3 www.google.com?q=asd& and thats it';
    $pattern = '/((http|ftp|https):\/\/(www\.)?|www\.)[^\s]*/';
    $return = preg_replace($pattern, '<link>', $string);
    var_dump($return);
?>

答案 3 :(得分:0)

你忘记了正则表达式周围的分隔符:

而不是:

$pattern = "(http|ftp|https):\/\/[\w\-_]+(\.[\w\-_]+)+([\w\-\.,@?^=%&amp;/~\+#]*[\w\-\@?^=%&amp;/~\+#])?";

尝试:

$pattern = "/(http|ftp|https):\/\/[\w\-_]+(\.[\w\-_]+)+([\w\-.,@?^=%&amp;\/~\+#]*[\w\-@?^=%&amp;\/~+#])?/";

$pattern = "{(ftp|https?)://[-\w]+(\.[-\w]+)+([-\w.,@?^=%&;/~+#]*[-\w@?^=%&;/~+#])?}";