3 回答

TA貢獻(xiàn)1828條經(jīng)驗 獲得超4個贊
你可以使用
(?<=\[)[^]\s]+(?=])
請參閱正則表達(dá)式和PHP 演示。請注意,該$matches
結(jié)構(gòu)在模式中沒有捕獲組時更清晰,所有上下文都使用非消耗性環(huán)視檢查。
細(xì)節(jié)
(?<=\[)
[
- 需要立即在當(dāng)前位置左側(cè)的正向后視[^]\s]+
- 除了]
(不需要轉(zhuǎn)義它,因為它是否定字符類中的第一個字符)和空格之外的1+ 個字符(?=])
]
- 需要緊靠當(dāng)前位置右側(cè)的正向前瞻(]
在字符類之外并不特殊)。
$arr = ['[text* your-name]','[email* your-email]','[text your-subject]','[textarea your-message]','[submit "Verzenden"]','[your-subject]','[your-name]','[your-email]','[your-message]'];
foreach ($arr as $s) {
if (preg_match_all('~(?<=\[)[^]\s]+(?=])~', $s, $matches)) {
print_r($matches[0]);
}
}
輸出:
Array
(
[0] => your-subject
)
Array
(
[0] => your-name
)
Array
(
[0] => your-email
)
Array
(
[0] => your-message
)

TA貢獻(xiàn)1862條經(jīng)驗 獲得超6個贊
從您當(dāng)前的模式開始,您所要做的就是從字符類中排除空格或所有空白字符,并檢查后面是否有右方括號。所以(?<=\[)([^]\s]+)(?=])
在整個比賽或捕獲組中的結(jié)果(這使它無用)。
但是你可以寫一個更好的模式,更簡單,更高效:\[([^]\s]+)]
。演示
更簡單,因為有一個捕獲組,你不必使用環(huán)視來提取你想要的沒有括號的內(nèi)容。它也更短,更容易理解。
由于兩個啟動優(yōu)化,效率更高:
第一個也是最重要的:當(dāng)模式以文字字符串(此處為左括號)開頭時,快速算法會在字符串中搜索該文字字符串在主題字符串中出現(xiàn)的所有位置,并且只會在這些位置測試該模式. 否則,如果您將此括號括在后視中就是這種情況,則此啟動優(yōu)化是不可能的,并且將在主題字符串中的每個位置測試該模式。
第二種叫做自動占有。當(dāng)最終回溯不會改變結(jié)果時,它會在編譯時自動使量詞占有所有格。比如,停留的時候
a*b
變成。在我們的例子中,由于字符類不包括右括號,因此變?yōu)? 具體而言,當(dāng)找到空格而不是右括號時,貪婪量詞不會返回字符來嘗試其他可能性,模式失敗,正則表達(dá)式引擎會在下一個位置嘗試模式。再一次,將括號放在前瞻中會禁用此優(yōu)化。a*+b
a.*b
a.*b
[^]\s]
[^]\s]+]
[^]\s]++]
但是為什么環(huán)視會禁用這些優(yōu)化呢?原因很簡單,這些優(yōu)化需要研究模式,所以為了讓這些分析保持快速,它們僅限于簡單的情況。(請注意,捕獲組不會干擾自動占有。)
如果你絕對想避免捕獲組但又想保留這兩個優(yōu)化,那么沒有什么可以禁止寫的:
\[\K[^]\s]++(?=])
演示
或更有趣:
\[(?=[^]\s]++\K])
演示
這兩個模式以文字開頭[
,所有格量詞是手動添加的。

TA貢獻(xiàn)1777條經(jīng)驗 獲得超10個贊
- 3 回答
- 0 關(guān)注
- 154 瀏覽
添加回答
舉報