【问题标题】:Why does regex fail to match quotes?为什么正则表达式无法匹配引号?
【发布时间】:2020-01-31 23:29:05
【问题描述】:

在我的 wordpress 帖子内容中,我有一行 [yu_TOC title="Short Stories"]。我正在尝试将其与

preg_match('/\[yu_TOC title=\"(.*?)\"\s*\]/', $content[0], $matchedTitle);

我已使用error_log(substr($content, 0, 1000)); 打印出我想匹配的行。

输出(相关部分)是[yu_TOC title=”Short Stories”]</p>

是否预计引号已从" 更改为”

为什么我的模式与应该匹配的行不匹配?

如何解决?

更新:我尝试将 []s 替换为 {}s,仍然是同样的问题。

【问题讨论】:

  • 看起来内容在传递给 preg_match 之前是用htmlspecialchars 或类似的东西编码的。
  • @MichalHynčica 是的,我注意到了很多 :)

标签: php regex wordpress unicode


【解决方案1】:

如果这些引号已更改并且您还想匹配编码版本,您可以使用 alternation 匹配捕获组中的任何一个,然后使用 backreference \1 进行与伴随的最后一场比赛。

您的值在第二个捕获组中,因为第一个组用于反向引用。

\[yu_TOC title=("|”)(.*?)\1\s*\]

Regex demo | Php demo

注意你不必转义"

例如

$content = ["[yu_TOC title=&#8221;Short Stories&#8221;]</p>"];
preg_match('/\[yu_TOC title=("|&#8221;)(.*?)\1\s*\]/', $content[0], $matchedTitle);
print_r($matchedTitle);

输出

Array
(
    [0] => [yu_TOC title=&#8221;Short Stories&#8221;]
    [1] => &#8221;
    [2] => Short Stories
)

【讨论】:

  • 谢谢!你知道为什么引号发生了变化,当字符变成它们的 unicode 等价物时有什么一般规则吗?
  • 很遗憾,我对 wordpress 本身一无所知,所以恐怕我不知道这个问题的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-21
  • 1970-01-01
  • 2022-01-04
  • 1970-01-01
  • 2022-08-17
相关资源
最近更新 更多