[英]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.