與所有有關使用正則表達式來解析HTML免責聲明......只有當你準備好了一些遞歸美容 ...
匹配你想要的東西與拆分於你別t想要
如果你打算使用正則表達式,在這種情況下,爲了獲得你的數組,匹配你想要的將比分裂你不想要的更容易。這是一個起點,我們可以提煉:
(\[(?:[^[\]]++|(?1))*\])|<[^>]*>|'[^']*'|[!-~]+
見demo。
它是如何工作的:
- 我們相匹配的幾種可能性,通過交替操作
|
- 第一場比賽選擇
(\[(?:[^[\]]++|(?1))*\])
分離遞歸匹配所有[sets of [brackets]]
- 的
<[^>]*>
匹配`」
'[^']*'
匹配'complete quotes'
。如果需要,可以對其進行改進以考慮潛在的轉義報價\'
[!-~]+
匹配所有剩餘的空格可打印字符。這是一個猜測,根據您輸入的唯一單詞asqwedasd
,這也可以被改進。舉例來說,如果要指定,爲了進行驗證,將剩餘的字符串沒有<>[]
字符,你可以用這個代替(由@CasimiretHippolyte建議)\s*\K[^[<]+(?<!\s)
示例代碼
見本輸出this demo。數組$m[0]
包含您想要的「分割」。
$regex = "%(\[(?:[^[\]]++|(?1))*\])|<[^>]*>|'[^']*'|[!-~]+%";
$string = "<As's\\as'dsd> asqwedasd <sa sdasd> [a sadasd] [<asdsad> [as ddsd]] 'asdsad assd'";
$count = preg_match_all($regex,$string,$m);
print_r($m[0]);
另一種解決方案
@HamZa想出了另一種解決辦法,我覺得挺漂亮的。他不想自己張貼,但很高興我在此添加完成。
它是如何工作的?這個想法是匹配正確的空間角色,並分割它們。這個問題的基本原理在這個關於"regex-matching a pattern unless..."的問題中有詳細的解釋。首先,以與我的正則表達式類似的方式(但更多的檢查和遞歸),他定義了所有我們想要匹配的組,並匹配它們。然後,他使用(*SKIP)(*F)
使正則表達式失敗,如果這些組相匹配,那麼引擎將跳到匹配的最後一個字符後面的字符串中的位置。在另一方面,他匹配我們將分裂的空間角色,並且我們知道這些是正確的空間角色,因爲他們沒有與左邊的表情匹配。在這個階段,我們可以使用preg_split
。
進一步的改進是使用我所說的HRRT
,它代表HamZa正則表達式重構技術。爲了使正則表達式易於理解,他將其分解成更小的命名模式:singlequotes
,brackets
等等。這讓他爲所有這些組定義了另一個名字:skippable
。定義之後,匹配開始。如果我們可以匹配skippable
模式,則正則表達式將以(*SKIP)(*F)
失敗,並且引擎會跳到字符串中的下一個位置。
這是它的要義。
這是the demo。
(?(DEFINE)
(?P<signs>
<
(?:
[^<>]
|
(?&signs)
)*
>
)
(?P<brackets>
\[
(?:
[^][]
|
(?&brackets)
)*
\]
)
(?P<singlequotes>
(?<!\\)'(?:[^\\]|\\.)*?'
)
(?P<doublequotes>
(?<!\\)"(?:[^\\]|\\.)*?"
)
(?P<quotes>
(?&singlequotes)|(?&doublequotes)
)
(?P<skippable>
(?&brackets)|(?&signs)|(?"es)
)
)
(?&skippable)(*SKIP)(*FAIL)
|
[ ]+
'使preg_split()'? –
只需要學習如何在這種情況下使用正則表達式,沒有什麼更多。這裏有一些鏈接[有關前瞻和lookbeheads的非常有用的信息](http://www.regular-expressions.info/lookaround.html) – Ohgodwhy
@EugenRieck我在這裏讀過'preg_split()'不知道如果有東西在引號中。 – miestasmia