我正在使用 preg_match_all() 在用户模板中搜索一些自定义标记 . 但是,该函数不匹配包含 $ 字符的字符串 .

模板标签可以采用两种形式: [TagName][TagName|some text here|some other text here] .

这是我正在使用的正则表达式:

preg_match_all('/\[([^\]\|]+)(\|)?([^\]\|]*)\|?([^\]\|]*)\]/',$thank_you_screen_text,$thank_you_tags,PREG_SET_ORDER);

这些字符串都匹配:

[Name1]
[AddTour|Yes!|no]
[NumberOfPersonsForRoomOut| x 2889 =|          ]
[CardholderName|Cardholder's Name:|]

但是,其中包含 $ 字符的任何字符串都将失败 . 它根本不匹配字符串 . 这些根本不匹配:

[NumberOfPersonsForRoomOut| x $2889 =|          ]
[NumberOfPersonsForRoomOut| x \$2889 =|          ]
[RoomSubtotalOut|\$|]

我已经在regex101.com and it works there使用Regex Tester试用了它 . 我究竟做错了什么?


以上结果在使用PHP 5.5.22和PCRE Library Version 8.34 2013-12-15的服务器上 .

但是,我在其他几台服务器上试过它,一切都像我期望的那样匹配!其他服务器是PHP 5.5.38 / PCRE 8.38和PHP 5.5.15 / PCRE 8.34 . 它似乎不是PCRE的版本问题 . 还有什么可能导致特定服务器上的此行为?