作为经验法则,最好使用单引号字符串来描述您的正则表达式模式。
使用双引号字符串,PHP 和 PCRE 对字符串中哪些部分是转义序列的解释之间的交互可能会变得很混乱。正则表达式本身已经足够混乱了,不需要再添加一层转义来使情况变得更糟。
作为经验法则,最好使用单引号字符串来描述您的正则表达式模式。
使用双引号字符串,PHP 和 PCRE 对字符串中哪些部分是转义序列的解释之间的交互可能会变得很混乱。正则表达式本身已经足够混乱了,不需要再添加一层转义来使情况变得更糟。
对于看到此错误的任何人
警告:preg_match() [function.preg-match]:编译失败:PCRE 不支持 \L、\l、\N、\P、\p、\U、\u 或 \X 在 ...
正如本手册页所说,您需要 PHP 5.1.0 和 /u 修饰符才能启用这些功能,但这并不是唯一的条件!即使链接到较旧的 PCRE 安装,也可能安装更高版本的 PHP(我们有 5.1.4)。快速查看 PCRE 变更日志表明您可能至少需要 PCRE 5;我们正在运行 4.5,而最新版本是 7.1。您可以通过查看 phpinfo() 来了解您的 PCRE 版本。
我怀疑这个古老的 PCRE 版本包含在一些官方支持的 Red Hat Enterprise 包中,这可能就是我们运行它的原因,也可能影响其他用户。
在上面的字符类元字符文档中,描述了插入符号 (^)
"^ 否定类,但仅在第一个字符"
它应该更详细一些才能完全表达 ^ 的含义
^ 否定字符类。如果使用,它必须是类的第一个字符(例如 "[^012]")。
关于下面两篇文章中的 strip_selected_tags 函数
如果有人使用没有结束 ">" 字符的标签,它不起作用,例如
<p <b> 粗体文本 </b</p
这甚至是有效的 HTML(但不是有效的 XHTML)
如果您像我一样倾向于使用 /U 模式修饰符,那么您需要记住,使用 ? 或 * 测试可选字符,如果这意味着模式的其余部分可以继续匹配,即使可选字符存在,也会匹配零个字符。
例如,如果我们有这个字符串
a___bcde
并应用此模式
'/a(_*).*e/U'
整个模式都匹配,但没有一个 _ 字符被放置在子模式中。解决方法(如果您仍然希望使用 /U)是使用 ? 贪婪反转器。例如,
'/a(_*?).*e/U'
我以前从未使用过正则表达式,在尝试将 [url] 这里链接 [/url] 转换为 href 以便在论坛上发布消息时遇到了很多困难,这是我想到的
$patterns = array(
"/\[link\](.*?)\[\/link\]/",
"/\[url\](.*?)\[\/url\]/",
"/\[img\](.*?)\[\/img\]/",
"/\[b\](.*?)\[\/b\]/",
"/\[u\](.*?)\[\/u\]/",
"/\[i\](.*?)\[\/i\]/"
);
$replacements = array(
"<a href=\"\\1\">\\1</a>",
"<a href=\"\\1\">\\1</a>",
"<img src=\"\\1\">",
"<b>\\1</b>",
"<u>\\1</u>",
"<i>\\1</i>"
);
$newText = preg_replace($patterns,$replacements, $text);
一开始它会将所有标签收集到一个链接/粗体/任何东西中,直到我添加了 "?" 我仍然没有完全理解它... 但它确实有效 :)
关于“与 Perl 的区别”中的注释 #6,\G 标记 *是* 支持的作为最后一个匹配位置锚点。已确认这至少在 preg_replace() 中有效,尽管我认为它也会在 preg_match_all() 和其他可以进行多次匹配的函数中有效。