【问题标题】:PHP preg_replace removes the whitespacePHP preg_replace 删除空格
【发布时间】:2014-04-03 08:37:45
【问题描述】:

我有一个字符串:

$test = "Test string<i> hello world</i>."

那我跑了

$test = preg_replace('/(<i>{1}\s*)([\w*\d*\D*\W*\x*\O*\S*\s*]*?)(<\/i>{1})/', '<italic>$2</italic>', $test);

结果是

Test string<italic>hello world</italic>.

为什么 hello world 之前的空格丢失了?

这是一个例子http://pastebin.com/SXFhsCGK

谢谢。

【问题讨论】:

  • [\w*\d*\D*\W*\x*\O*\S*\s*] 哎哟。你想在这里做什么?
  • 我正在尝试匹配 之间的所有内容。目标是用 标签替换 标签
  • 当然,这可以做到,但问题不在于如何以不同的方式做到这一点,而是为什么会发生这种情况。
  • 这会占用 之后的空格:(&lt;i&gt;{1}\s*)。顺便说一句,我猜&lt;i&gt;{1} 不是您想要的,它说“匹配&lt;,然后匹配i,然后匹配(正好是一个,这是默认值)&gt;”。
  • preg_replace('%&lt;(/?)i&gt;%', '&lt;$1italic&gt;', $test)

标签: php regex preg-replace


【解决方案1】:

解决方案

正如@Reeno 在 cmets 中所说,直接用 &lt;italic&gt; 替换 &lt;i&gt; 标签是可行的方法(假设它们都是您要替换的标签):

preg_replace('%<(/?)i>%', '<$1italic>', $test)

你的正则表达式出了什么问题

空间丢失,因为它与&lt;i&gt;{1}\s*中的\s*匹配,所以它不在捕获组中。

另外,写[\w\W...] 的意思是“匹配任何字母数字字符或任何非字母数字字符”......所以基本上,匹配所有内容。

{1} 量词(总是?)没用(&gt;{1} 等同于&gt;)。

启发式地,你想要做的是使用这个正则表达式(s 是为了让点也匹配换行符):

~<i>(.*?)</i>~s

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-17
    • 1970-01-01
    相关资源
    最近更新 更多