【问题标题】:Regex find specific string only between two other specific strings正则表达式仅在其他两个特定字符串之间查找特定字符串
【发布时间】:2014-02-15 09:47:11
【问题描述】:

基本上,我需要替换大约 3000 个文档中的 css 类警报,因为它会破坏引导 css。我可以通过搜索 (?<=class=")(.*)(?=") 找到整个 css 类,但我不能只使用 (?<=class=".*)(alert)(?=.*") 或类似的东西找到警报类。

基本上,给定一组数据:

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

我只想在类属性中找到文本警报。

我有一种感觉,如果有一个可行的解决方案,它将在前瞻/后视中涉及可选的通配符。比如:

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

【问题讨论】:

  • because it breaks bootstrap css 为什么不改变引导 css?如果你不能/不想,你应该使用适当的 DOM 解析器来解析这些页面,不要使用正则表达式。
  • 我不是在谈论 Web 浏览器中的任何内容或使用 javascript。我说的是 FreeBSD 中文件系统中的文档。
  • (?&lt;=class=")(.*alert.*)(?=")怎么样
  • @MElliott 这是我尝试的第一件事,它在类属性中找到所有类。我认为,我需要通配符成为向前/向后展望的一部分。
  • @user1119648 一个类属性中会不会有多个alert

标签: php html css regex


【解决方案1】:

你可以试试这样的表达方式:

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

然后替换占位符就像

$1$2

导致

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

【讨论】:

  • PHP preg 5.3.6–5.3.185.4.9–5.4.13 不支持后向变量重复。
【解决方案2】:

任何标签的正则表达式,例如divspanp

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

div标签的正则表达式:

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

作为替代选择以下之一:

alert 替换为alternative-alert-class-name

$1alternative-alert-class-name$2

或将alert 替换为空:

$1$2

PHP 代码(注意使用不区分大小写):

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

示例输入:

<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>

示例输出:

<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>

【讨论】:

    【解决方案3】:

    你可以用这个:

    $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);
    

    【讨论】:

      猜你喜欢
      • 2019-11-25
      • 1970-01-01
      • 2020-01-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-05
      • 1970-01-01
      相关资源
      最近更新 更多