簡體   English   中英

PHP 和 MariaDB 之間的 PCRE RegEx 差異

[英]PCRE RegEx difference between PHP and MariaDB

我有一個使用 PHP(也不是 regex101.com)但與 MariaDB 不匹配的正則表達式。 其目的是在 XML 值中搜索 HTML 類(編碼 HTML)。

這是一個示例 XML 值,您可以在其中看到具有liste--non-ordonnee--gros--exergue CSS ZA2F2ED4F8EBC2CBB4C21A29DC40AB61D 的<ul>元素:

&lt;ul class=&quot;liste--non-ordonnee--gros--exergue&quot;&gt;

我希望 RegEx 只匹配完整的課程。 因此,如果我搜索--exergue我不希望它匹配。 使用 PHP 或其他 PCRE/PCRE2 在線測試儀不匹配:

~(class=&quot;(?:[^&]*\s)?)--exergue~sU

但是使用 MariaDB (v10.2.40 - PCRE 8.42),它匹配:

(?sU)(class=&quot;(?:[^&]*\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=&quot;(?:.*)?&quot;.*

與單次匹配相比,XML 會更准確地匹配。 這意味着,您已經刪除了示例數據,因此可能歪曲了問題。

首先,您的案例非常短的 MCVE:

SELECT 'class=&quot;s--e' REGEXP '(?sU)(class=&quot;(?:[^&]*\s)?)--e'

MariaDB 匹配,PHP 不匹配(演示)。 為什么? 在 MariaDB 的REGEXP手冊中:

注意:由於 MariaDB 在字符串中使用 C 轉義語法(例如,“\n”表示換行符),因此您必須將您在 REGEXP 字符串中使用的任何“ \ ”加倍。

您的問題是由應該在 MariaDB 查詢中雙重轉義為\\s\s引起的。 一旦你解決了這個問題,PHP 和 SQL 正則表達式語句變得等效並且行為相同。

將不匹配(與--e不以空格為首):

SELECT 'class=&quot;s--e' REGEXP '(?sU)(class=&quot;(?:[^&]*\\s)?)--e'; 

匹配( --e由空格引導):

SELECT 'class=&quot;s --e' REGEXP '(?sU)(class=&quot;(?:[^&]*\\s)?)--e';

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM