簡體   English   中英

修改正則表達式以僅在它不包含字符串時選擇所有字符

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

似乎不起作用(有和沒有 =),它與原始效果相同

(.*?)

一些信息:

  • 使用 PHP
  • 沒有數據庫,必須從平面文件工作
  • 必須對有可能使失敗變大的字符串做其他幾件事。 基於測試數據,正則表達式本質上更快

模式^((?!(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.

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