我有一个非常简单的问题,......给了我一个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\-\.,@?^=%&/~\+#]*[\w\-\@?^=%&/~\+#])?";
$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
答案 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\-\.,@?^=%&/~\+#]*[\w\-\@?^=%&/~\+#])?";
尝试:
$pattern = "/(http|ftp|https):\/\/[\w\-_]+(\.[\w\-_]+)+([\w\-.,@?^=%&\/~\+#]*[\w\-@?^=%&\/~+#])?/";
或
$pattern = "{(ftp|https?)://[-\w]+(\.[-\w]+)+([-\w.,@?^=%&;/~+#]*[-\w@?^=%&;/~+#])?}";