如何在PHP中使用正则表达式匹配空格、回车和换行?

57

我正在使用 PHP 中的正则表达式。我有以下字符串:

<img 
src="/files/admin/hotel_website.gif" alt="Go To The Hotel's Web 
Site" align="absmiddle" border="0" class="hotel_icon" />

这个字符串包含回车和换行字符。

我希望我的正则表达式能将HTML的img标签替换为IMG,但对于上面的文本无效。

我通过循环遍历字符串中的每个字符并打印出16进制表示发现它包含这些字符,可以在这里找到(http://pastebin.com/ViNdBsRV)。

这是我的正则表达式:

strip_tags(preg_replace('/^\s*<img\s*.*\/?>\s*$/i', '[IMG]', $test));
感谢您的帮助。

你能告诉我你期望从起始字符串中得到什么字符串吗? - KodeFor.Me
3个回答

127

[\n\r]+将匹配换行符。如果要匹配空格,请使用[\n\r\s]+


我将这个正则表达式添加进去了,但它并没有起作用:'/^\s*<img[\s\r\n].*/?>\s$/i'。 - Mr B
不要忘记,你必须使用带引号的解释字符串才能使其有效!使用 ' 将只会得到字面值。 - Kzqai
如果我只想要CRLF空格,应该使用什么表达式? - Sankalp Kotewar
1
@SankalpKotewar 我觉得你需要同样的东西。我没有测试过,但是\n代表LF,而\r代表CR,(至少我希望我没有错)。你试过只用[\n\r]吗? - KodeFor.Me
\s 隐式匹配 \r\n,因此 [\n\r\s] 是多余的且与 \s 等效。 - Marcel

11

这个:

preg_replace("#<img.+?/>#is", '[IMG]', $test)

通常我编写正则表达式时总是尽可能地去寻求最短/简单的方式。 在这里,您需要替换一个完整的标签,它以'<img' 开始并以 '/>' 结束,'.+?' 是一个非贪婪(懒惰)的匹配。 对于修饰符,'i' 用于忽略大小写匹配,而 's' 允许 '.' 匹配包括换行符在内的任意字符。

更多关于贪婪和懒惰的信息:http://www.regular-expressions.info/repeat.html
更多关于修饰符的信息:http://www.php.net/manual/en/reference.pcre.pattern.modifiers.php


这个按预期工作了,感谢您的全面解释。我稍微调整了一下以适应其他情况:/<img.+?/?>\s*$/is - Mr B
@Sid,你不需要添加\s$,我的解决方案已经可以在整个页面上替换<img />(这是我测试正则表达式的方法)。 - 3on
我添加了 $ 符号,因为我从数据库表中获取 HTML 字符串。 - Mr B

5

这对我有用,它匹配多个空格和多行文本,也可以匹配任何其他字符或符号。

[\S+\n\r\s]+

希望这能帮到任何人。
例如,它匹配:
stpd  : asdfasdf
this is also matching ***

12
在方括号[]内放置加号+将匹配一个文字的加号。\S\s的相反,因此您基本上匹配任何字符。 [\s\S]+是解决方案,因为.通常不匹配换行符。这种匹配本身没有太多用处。 - bradlis7

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接