【问题标题】:preg_match adds an unwanted whitespacepreg_match 添加了不需要的空格
【发布时间】:2015-06-04 09:48:37
【问题描述】:

让我们用 Windows 编辑器编写一个文件(因此,生成的 endline char 可能与 Unix 不同):

TITLE:Hello
URL:hello.html
AUTHOR:Bob

然后

content = file_get_contents($page);
preg_match("/^URL:(.*)$/m", $content, $matches);      

echo $matches[1] . '#test';

返回

hello.html 
#test

而不是

hello.html#test

我可以通过 View > Line Endings > Unix 解决问题并使用 Sublime Text 重新保存。

但是无论我使用哪种文本编辑器/平台,如何防止出现这个额外的空间?

【问题讨论】:

  • 你可以在运行正则表达式之前使用trim($content)
  • @treegarden 哦,是的,没错,trim($matches[1]) 解决了问题! (但不是trim($content)
  • 哎呀。是的,当然你是对的。
  • @treegarden 如果你转换成答案,我会接受!
  • 没关系。在我看来不值得回答;)谢谢

标签: php regex preg-match eol


【解决方案1】:

你可以这样做:

preg_match("/^URL:(\S+)/", $content, $matches); 

\S+ 至少匹配一个非空格字符。 URL 不包含空格,因此在第 1 组中,您的 url 末尾没有空格。

如果要匹配的字符串中间有空格:

preg_match("/^URL:(.+?)\s*$/", $content, $matches); 

【讨论】:

  • 谢谢!你能解释一下吗?为什么不再使用 /^URL:(.*)$/m^$
  • 我可能会将它用于 URL 以外的其他字段,中间可以有空格。除了最后的空格和 Windows/Unix 换行符之外,有没有办法匹配正确的东西?
【解决方案2】:

几种可能性:

1) 您可以使用非贪心量词,后跟可选的回车:

/^URL:(.*?)\r?$/m

2) 您可以以不以空格字符结尾的方式更明确地描述捕获组:

/^URL:\h*(\S+(?:\h+\S+)*)/m

\h 是水平空格的字符类。

【讨论】:

    猜你喜欢
    • 2021-07-05
    • 1970-01-01
    • 2022-06-16
    • 2014-05-07
    • 2014-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-14
    相关资源
    最近更新 更多