匹配属性名称中包含特殊字符的属性单元的正则表达式

Regular Expression that matches attribute units in attribute names including special characters

我对使用正则表达式还很陌生,而且我被困在一个我试图解决的问题上。我无法理解正在发生的事情,我希望有人能给我指明正确的方向。

我想要实现的目标:

为了避免视图中出现重复,我想检查属性名称是否包含相应的属性单元。例如,如果 $attribute['name'] = "Cutting speed (in m/Min.)"attribute['unit'] = "m/min" 属性单元不应显示,因为它已在名称中提及。

我是如何实现的:

我正在使用以下正则表达式检查属性单元:~\b' . attribute['unit'] . '\b~i' 这适用于上述示例,但如果单位是特殊字符,例如 %",则效果不佳。

问题

在测试特殊字符问题时,我遇到了以下现象:

如果我使用此正则表达式 /\b%\b/ 它的行为与预期不符并且匹配 bla%bla 中的 % 但不匹配 % 如果它之前或之后是space: https://regex101.com/r/56iYEI/3

似乎 % 将正则表达式的行为变为相反。我也测试了其他"special characters"("和&),它们似乎有相同的效果。

我之前被引导到这个问题 (Regular Expression Word Boundary and Special Characters) 并阅读了答案。我现在明白 \b 检查单词边界。但我仍然不清楚为什么它会在 %" 出现时表现得如此。

问题

  1. 为什么 % 将单词边界检查改变 \b 左右?
  2. 如何实现我的目标来匹配字母数字单元以及特殊字符单元,例如 %"

期待任何提示。提前致谢!

分词是一串单词字符和一串非单词字符(或开始或结束)之间的点。非单词字符不必是 space.

 foo"@#bar {}qux

在此字符串中,单词 break 位于 foobarqux 之前和之后。

表达式 /\b"@#\b/ will match chars between foo and bar. However /\b"@\b/ 不会,因为 @ 之后没有单词(因此没有分词)。


要解决此问题,请检查分词符或非单词字符。以下表达式匹配两种情况; /(^|\W|\b)"@($|\W|\b)/.

'~(^|\W|\b)' . attribute['unit'] . '($|\W|\b)~i'

P.S。如果 attribute['unit'] 可以包含任何字符,请务必在使用 preg_quote().

在正则表达式中使用它之前引用