[英]PCRE RegEx difference between PHP and MariaDB
我有一个使用 PHP(也不是 regex101.com)但与 MariaDB 不匹配的正则表达式。 其目的是在 XML 值中搜索 HTML 类(编码 HTML)。
这是一个示例 XML 值,您可以在其中看到具有liste--non-ordonnee--gros--exergue
CSS ZA2F2ED4F8EBC2CBB4C21A29DC40AB61D 的<ul>
元素:
<ul class="liste--non-ordonnee--gros--exergue">
我希望 RegEx 只匹配完整的课程。 因此,如果我搜索--exergue
我不希望它匹配。 使用 PHP 或其他 PCRE/PCRE2 在线测试仪不匹配:
~(class="(?:[^&]*\s)?)--exergue~sU
但是使用 MariaDB (v10.2.40 - PCRE 8.42),它匹配:
(?sU)(class="(?:[^&]*\s)?)--exergue
它查找包含要替换的 class 的class
属性。 为了演示目的,我尝试将 class 名称更改为其他名称(在class-with--suffix
中搜索--suffix
),但它在 MariaDB 版本上不再匹配。
我的 RegEx 或其 MariaDB 版本有什么问题?
I am aware that regular expressions should not be used with HTML and am open to alternatives but this is TYPO3: storing encoded HTML into XML values in a db column. 设计更改需要大量 class 重命名。
这与 PHP preg
8.0.x 匹配,在 169 步内(仍有改进的余地):
.*\sclass="(?:.*)?".*
与单次匹配相比,XML 会更准确地匹配。 这意味着,您已经删除了示例数据,因此可能歪曲了问题。
首先,您的案例非常短的 MCVE:
SELECT 'class="s--e' REGEXP '(?sU)(class="(?:[^&]*\s)?)--e'
MariaDB 匹配,PHP 不匹配(演示)。 为什么? 在 MariaDB 的REGEXP手册中:
注意:由于 MariaDB 在字符串中使用 C 转义语法(例如,“\n”表示换行符),因此您必须将您在 REGEXP 字符串中使用的任何“
\
”加倍。
您的问题是由应该在 MariaDB 查询中双重转义为\\s
的\s
引起的。 一旦你解决了这个问题,PHP 和 SQL 正则表达式语句变得等效并且行为相同。
这将不匹配(与--e
不以空格为首):
SELECT 'class="s--e' REGEXP '(?sU)(class="(?:[^&]*\\s)?)--e';
这将匹配( --e
由空格引导):
SELECT 'class="s --e' REGEXP '(?sU)(class="(?:[^&]*\\s)?)--e';
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.