![](/img/trans.png)
[英]Regex, string is a combination of whitelisted characters and doesn't contain any in blacklist
[英]modify a regex to select all characters only if it doesn't contain a string
原始正則表達式:
<div class="msgln"(.*?)</div>
我正在嘗試編輯此正則表達式,以便它僅選擇與此模式匹配的“行”:
(begining literal string)
后跟(any number of characters if they don't contain a specific string)
后跟(ending literal string)
我發現的常見方法是^((?!(cat|dog)).)*$
但它似乎不起作用,除非我沒有正確使用它。
例子:
<?php
$phpString = '<div class="msgln" a="dog" b="cat">stuff here</div>
<div>just another line</div>
<div class="msgln" a="another" b="one">stuff here</div>';
$phpString = preg_replace('~<div class="msgln"(.*?)</div>~i', "", $phpString);
?>
在這個例子中,我想要做的是只選擇字符串中的第一個“行” cat|dog
而不是第三個與another|one
。 上面的原始正則表達式按預期選擇了class="msgln"
兩條 div 行(忽略了 midle div 行),因此我試圖更改(.*?)
部分以僅選擇其中包含 cat 或 dog 的行。
我已經看過了,但找不到有效的解決方案。 以前的搜索有一些類似上面的常見建議,但沒有一個有效。
我確實找到了這個
(.*)(?=(dog|cat))(.*)
至極選擇該行,但嘗試否定以選擇所有其他行
(.*)(?!=(dog|cat))(.*)
似乎不起作用(有和沒有 =),它與原始效果相同
(.*?)
一些信息:
模式^((?!(cat|dog)).)*$
作用是定位字符串^
的開頭並檢查字符串是否不包含 cat 或 dog。 ( (?!foo)
是一個負面的前瞻)。 如果是這種情況,它將從字符串的開頭開始匹配實際字符(.)*
直到結尾$
。
在您的場景中,如果您想匹配不 (!) 包含單詞“another”或“one”的字符串,只需更改單詞: ^((?!(another|one)).)+$
。 注意我將末尾的*
(零個或多個)更改為+
(一個或多個),因為對於前者,模式可能匹配長度為零的空字符串,這可能會導致問題:)。
更新:
基於 gjzwiers 的建議,這里是最后一個似乎有效的正則表達式(PHP preg_replace)
$data = preg_replace('~<div class="msgln"((?!(dog|cat)).)+</div>~im', "", $data);
我忘記了“m”標志。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.