简体   繁体   English

正则表达式仅在其他两个特定字符串之间查找特定字符串

[英]Regex find specific string only between two other specific strings

Basically, I need to replace the css class alert in about 3000 documents because it breaks bootstrap css. 基本上,我需要在约3000个文档中替换css类警报,因为它会破坏引导css。 I can find the entire css class by searching (?<=class=")(.*)(?=") , but I can't just find the alert class by using (?<=class=".*)(alert)(?=.*") or anything like that. 我可以通过搜索(?<=class=")(.*)(?=")来找到整个CSS类,但是我不能仅通过使用(?<=class=".*)(alert)(?=.*")或类似的内容。

Basically, given a set of data: 基本上,给定一组数据:

<div class=" big alert solid">Alert alert</div>
<div class="alert solid">Alert alert</div>
<div class=" big solid">Alert alert</div>

I only want to find the text alert inside the class attribute. 我只想在class属性内找到文本警报。

I have a feeling if there is a working solution for this it will involve optional wildcards in the look ahead/behind. 我有一个解决方案,那就是在前/后方使用可选的通配符。 Something like: 就像是:

(?<=class="(.)?)(.*)(?=(.)?")

You can try expression like this: 您可以尝试这样的表达式:

(?<=class\s?=\s?")(.*?)alert(.*?)(?=")

and replacement placeholder then will be like 然后替换占位符将像

$1$2

resulting in 导致

<div class=" big  solid">Alert alert</div>
<div class=" solid">Alert alert</div>
<div class=" big solid">Alert alert</div>

Regular expression for any tag eg div , span and p : 任何标签的正则表达式,例如divspanp

(<[A-Z][A-Z0-9]*\b[^>]*\bclass\s*=\s*"(?:|[^"]+))\balert\b((?:|[^"]+)")

正则表达式可视化

Regular expression for just div tags: div标签的正则表达式:

(<div\b[^>]*\bclass\s*=\s*"(?:|[^"]+))\balert\b((?:|[^"]+)")

As a replacement choose one of the following: 作为替换,选择以下选项之一:

Replace alert with alternative-alert-class-name : alternative-alert-class-name替换alert

$1alternative-alert-class-name$2

Or replace alert with nothing: 或以任何内容替换alert

$1$2

PHP code (note the use of case insensitivity): PHP代码(注意区分大小写的使用):

$result = preg_replace('/(<[A-Z][A-Z0-9]*\b[^>]*\bclass\s*=\s*"(?:|[^"]+))\balert\b((?:|[^"]+)")/imx', '$1alternative-alert-class-name$2', $subject);

Example input: 输入示例:

<div class="alert">Alert alert</div>
<div class="alert solid">Alert alert</div>
<div class = "alert solid">Alert alert</div>
<div class=" big alert solid">Alert alert</div>
<div class = " big alert solid">Alert alert</div>
<div something="xx" class = " big alert solid">Alert alert</div>
<span enabled something="xx" class = " big alert solid">Alert alert</span>
<div class=" big solid">Alert alert</div>

Example output: 输出示例:

<div class="alternative-alert-class-name">Alert alert</div>
<div class="alternative-alert-class-name solid">Alert alert</div>
<div class = "alternative-alert-class-name solid">Alert alert</div>
<div class=" big alternative-alert-class-name solid">Alert alert</div>
<div class = " big alternative-alert-class-name solid">Alert alert</div>
<div something="xx" class = " big alternative-alert-class-name solid">Alert alert</div>
<span enabled something="xx" class = " big alternative-alert-class-name solid">Alert alert</span>
<div class=" big solid">Alert alert</div>

You can use this: 您可以使用此:

$data = <<<EOD
<div class=" big alert solid">Alert alert</div>
<div class = "other-alert-class solid">Alert alert</div>
<div class=" big solid">Alert alert</div>
<div class=' big alert solid'>Alert alert</div>
<div class  =  alert>Alert alert</div>
EOD;

$pattern = '~\sclass\s*=\s*(?>["\'](?>[^"\'a]++|(?<=\B|-)a|a(?!lert\b[^-]))*)?\Kalert\b~';

$result = preg_replace($pattern, 'otherclass', $data);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM