将开始和结束锚标记之间的字符串替换为其他字符串

2023-12-01

我需要用其他字符串替换一对锚标记之间的字符串。更清楚地说:

<a blah blah>Click Here</a>

我想更换'点击这里'<img src=... />标签。我阅读了一些其他资源,尝试了 Lars Olav Torvik 的正则表达式工具,但严重失败!

请帮帮我!


不要使用正则表达式来解析 HTML!

是的,一般来说,使用正则表达式来解析 HTML 充满了危险。计算机科学家会正确地指出 HTML 不是REGULAR语言。然而,与这里许多人认为的相反,在某些情况下使用正则表达式解决方案是完全有效和适当的。阅读 Jeff Atwoods 关于这个主题的博客文章:解析 Html 的克苏鲁方式。撇开免责声明不谈,让我们继续使用正则表达式解决方案......

问题重述:

原来的问题相当模糊。这是对问题的更精确的解释/重新表述(可能根本不是OP所要求的):

Given:我们有一些 HTML 文本(HTML 4.01 or XHTML 1.0)。这段文字包含<A..>...</A>锚元素。其中一些锚元素是图像文件资源的链接(即HREF属性指向以文件扩展名结尾的 URI:JPEG, JPG, PNG or GIF)。其中一些图像链接是简单的文本链接,其中锚元素的内容是纯文本,没有其他 HTML 元素,例如<a href="picture.jpg">Link text with no HTML tags</a>.

Find:是否有正则表达式解决方案可以采用这些“纯文本链接到图像资源文件”链接,并将链接文本替换为IMG元素具有SRC属性设置为相同的图像 URI 资源?以下(有效的 HTML 4.01)示例输入包含三个段落。第一段中的所有链接都要修改,但第二段和第三段中的所有链接都不要修改并保持原样:

HTML 输入示例:

<p title="Image links with plain text contents to be modified">
    This is a <a href="img1.png">LINK 1</a> simple anchor link to image.
    This <a title="<>" href="img2.jpg">LINK 2</a> has attributes before HREF.
    This <a href="img3.gif" title='<>'>LINK 3</a> has attributes after HREF.
</p>
<p title="NON-image links with plain text contents NOT to be modified">
    This is a <a href="tmp1.txt">LINK 1</a> simple anchor link to NON-image.
    This <a title="<>" href="tmp2.txt">LINK 2</a> has attributes before HREF.
    This <a href="tmp3.txt" title='<>'>LINK 3</a> has attributes after HREF.
</p>
<p title="Image links with NON-plain text contents NOT to be modified">
    This is a <a href="img1.png"><b>BOLD 1</b></a> anchor link to image.
    This is an <a href="img3.gif"><img src="img3.gif"/></a> image link to image.
</p>

所需的 HTML 输出:

<p title="Image links with plain text contents to be modified">
    This is a <a href="img1.png"><img src="img1.png" /></a> simple anchor link to image.
    This <a title="<>" href="img2.jpg"><img src="img2.jpg" /></a> has attributes before HREF.
    This <a href="img3.gif" title='<>'><img src="img3.gif" /></a> has attributes after HREF.
</p>
<p title="NON-image links with plain text contents NOT to be modified">
    This is a <a href="tmp1.txt">LINK 1</a> simple anchor link to NON-image.
    This <a title="<>" href="tmp2.txt">LINK 2</a> has attributes before HREF.
    This <a href="tmp3.txt" title='<>'>LINK 3</a> has attributes after HREF.
</p>
<p title="Image links with NON-plain text contents NOT to be modified">
    This is a <a href="img1.png"><b>BOLD 1</b></a> anchor link to image.
    This is an <a href="img3.gif"><img src="img3.gif"/></a> image link to image.
</p>

请注意,这些示例包括测试用例<A..>...</A>锚标记在所需的 HREF 属性之前和之后都有单引号和双引号属性值,并且包含 cthulhu 诱人的(但完全有效的 HTML 4.01)、尖括号。

另请注意,替换文本是一个以以下结尾的(空)IMG 标签:'/>'(这不是有效的 HTML 4.01)。

正则表达式解决方案:

问题的陈述定义了一个highly具体要匹配的模式有以下要求:

  • The <A..>...</A>开始标签之前和/或之后可以有任意数量的属性HREF属性。
  • The HREF属性值必须具有以以下结尾的值JPEG, JPG, PNG or GIF(不区分大小写)。
  • 的内容<A..>...</A>元素不得包含任何其他 HTML 标签。
  • The <A..>...</A>元素目标模式不是嵌套结构。

当处理如此高度特定的子字符串时,精心设计的正则表达式解决方案可以很好地工作(很少有边缘情况会导致问题)。这是一个经过测试的 PHP 函数,它可以很好地完成工作(并正确转换上面的示例输入):

// Convert text-only contents of image links to IMG element.
function textLinksToIMG($text) {
    $re = '% # Match A element with image URL and text-only contents.
        (                     # Begin $1: A element start tag.
          <a                  # Start of A element start tag.
            (?:               # Zero or more attributes before HREF.
              \s+             # Whitespace required before attribute.
              (?!href\b)      # Match attributes other than HREF.
              [\w\-.:]+       # Attribute name (Non-HREF).
              (?:             # Attribute value is optional.
                \s*=\s*       # Attrib name and value separated by =.
                (?:           # Group for attrib value alternatives.
                  "[^"]*"     # Either double quoted,
                | \'[^\']*\'  # or single quoted,
                | [\w\-.:]+   # or unquoted value.
                )             # End group of value alternatives.
              )?              # Attribute value is optional.
            )*                # Zero or more attributes before HREF.
            \s+               # Whitespace required before attribute.
            href\s*=\s*       # HREF attribute name.
            (?|               # Branch reset group for $2: HREF value.
              "([^"]*)"       # Either $2.1: double quoted,
            | \'([^\']*)\'    # or $2.2: single quoted,
            | ([\w\-.:]+)     # or $2.3: unquoted value.
            )                 # End group of HREF value alternatives.
            (?<=              # Look behind to assert HREF value was...
              jpeg[\'"]       # either JPEG,
            | jpg[\'"]        # or JPG,
            | png[\'"]        # or PNG,
            | gif[\'"]        # or GIF,
            )                 # End look behind assertion.
            (?:               # Zero or more attributes after HREF.
              \s+             # Whitespace required before attribute.
              [\w\-.:]+       # Attribute name.
              (?:             # Attribute value is optional.
                \s*=\s*       # Attrib name and value separated by =.
                (?:           # Group for attrib value alternatives.
                  "[^"]*"     # Either double quoted,
                | \'[^\']*\'  # or single quoted,
                | [\w\-.:]+   # or unquoted value.
                )             # End group of value alternatives.
              )?              # Attribute value is optional.
            )*                # Zero or more attributes after HREF.
          \s*                 # Allow whitespace before closing >
          >                   # End of A element start tag.
        )                     # End $1: A element start tag.
        ([^<>]*)              # $3: A element contents (text-only).
        (</a\s*>)             # $4: A element end tag.
        %ix';
    return preg_replace($re, '$1<img src="$2" />$4', $text);
}

是的,这个解决方案中的正则表达式很长,但这主要是由于广泛的注释,这也使得它高度可读。它还可以正确处理可能包含尖括号的带引号的属性值。是的,当然可以创建一些 HTML 标记来破坏这个解决方案,但是这样做所需的代码将非常复杂,几乎是闻所未闻的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将开始和结束锚标记之间的字符串替换为其他字符串 的相关文章

  • 字符串的正则表达式,必须至少包含 14 个字符,其中至少 2 个数字,至少 6 个字母

    我需要一个正则表达式来测试字符串的 最少 14 个字符 有效值为A Za z0 9 这 14 个字母中至少有 6 个字母 这 14 个数字中至少有 2 个 有没有一种方法可以将其包装在一个正则表达式中 目前我有一个 javascript 和
  • 如何使用 regexp 来匹配 TCL 中的括号

    我有一个关于在 TCL 中使用正则表达式匹配括号的问题 例如我有一个像这样的字符串 yes it is true and it is fine 我只想匹配这部分yes it is true 如何搭配呢 您可以将括号括在字符类中 如 boba
  • Scrapy规则如何与爬行蜘蛛一起工作

    我很难理解 scrapy 爬行蜘蛛规则 我有一个例子 它并不像我希望的那样工作 所以它可能是两件事 我不明白规则是如何运作的 我形成了不正确的正则表达式 导致我无法获得所需的结果 好吧 这就是我想做的 我想编写爬行蜘蛛 它将获取所有可用的统
  • 如何使用 mod rewrite / htaccess 创建具有两个或多个参数的友好 URL?

    新手在这里重写Mod 我想在 URL 中传递两个 URL 参数 但采用更友好的格式 如果用户通过 example com blah123 sys 在本例中我应该能够提取 MySQL 记录 blah123 和模式类型 sys 这是例子 URL
  • 有没有办法缩短这个正则表达式?

    以下正则表达式适合我的模式 但是 我想知道是否有办法缩短它 我不能使用 w 因为我只想要不区分大小写的英文字母 因为该模式重复 所以我想知道是否可以将其分组 如果可能的话 A Za z 5 A Za z 3 A Za z 3 A Za z
  • python 文件中的单词分析和评分

    我正在对一个句子进行逐字分析 例如 嘿那里 这是一部很棒的电影 我有很多像上面这样的句子 我有一个巨大的数据集文件 如下所示 我必须快速查找该单词是否存在 如果是 则进行分析并存储在字典中 例如从单词的文件中获取分数 句子最后一个单词的分数
  • 设计 DFA 接受可被数字“n”整除的二进制字符串

    我需要学习如何设计一个 DFA 使得给定任何数字 n 它接受二进制字符串 0 1 其十进制等效数可被 n 整除 不同的 n 会有不同的 DFA 但是有人可以给出一个基本方法 我应该遵循该方法来处理任何数字 0 下面我写了一个答案n等于 5
  • 使用正则表达式的 Strip() 函数

    我正在尝试重新创建strip 使用正则表达式的Python函数 这是最后一个练习题用 Python 自动化处理无聊的事情 https automatetheboringstuff com chapter7 这是我的代码 import re
  • 需要一个数字或一个非字母数字字符的密码正则表达式

    我正在寻找一个相当具体的正则表达式 我几乎有了它 但还不完全有 我想要一个至少需要 5 个字符的正则表达式 其中至少有一个字符是either一个数值or非字母数字字符 这是我到目前为止所拥有的 d a z 5 20 所以问题出在 或 部分
  • 使用正则表达式正确替换缩写及其扩展

    我需要更换 HYD 和 HYD 带液压 但正如你所见 HYD 没有得到转换 我究竟做错了什么 console log HYD bHYD b gi test HYD OK console log HYD CYLINDER bHYD b gi
  • 如何使用斯坦福TokensRegex?

    我正在尝试使用斯坦福大学TokensRegex 但是 我在匹配器行中遇到错误 请参阅注释 它说 请尽力帮助我 下面是我的代码 String file A store has many branches A manager may manag
  • 正则表达式会减慢程序速度

    我正在尝试创建一个程序来解析游戏聊天日志中的数据 到目前为止 我已经设法让程序运行并解析我想要的数据 但我的问题是程序变得越来越慢 目前解析 10MB 文本文件需要 5 秒 我注意到如果我将 RegexOptions Compiled 添加
  • 从字符串中提取数字 (Regex C++)

    假设我有一根绳子S 1 this is a number 200 Val 54 4class find57 我想用Regex仅提取这些数字 num 1 1 num 2 200 num 3 54 而不是 4class 中的 4 或 find5
  • 正则表达式删除块注释也删除 * 选择器

    我正在尝试使用 bash 从 css 文件中删除所有块注释 我有以下 sed 命令的正则表达式 sed r s w s w d 这可以很好地去除块注释 例如 This is a comment this is another comment
  • UcanaccessSQLException:UCAExc:::3.0.1 表达式的数据类型不是布尔值

    我有一张如下图所示的表格 我需要获取其库尔德语单词包含的所有英语单词 r 所以我不能使用 select English from Table1 where Kurdish like 因为它还接受另一个单词中的子字符串 例如 当我尝试在查询中
  • 正则表达式接受 4 条规则中的 3 条

    我似乎无法让正则表达式正确满足以下要求 长度在 8 到 20 之间的字符串 必须包含至少 1 个大写字母字符 至少 1 个小写字母字符 以及至少 1 个数字或至少 1 个特殊字符字符 或两者 假设特殊字符仅限于包括 我最初是这样写的 A Z
  • Javascript 正则表达式来匹配正则表达式

    我正在研究一个特殊的正则表达式来匹配 javascript 正则表达式 现在我有这个正则表达式工作 i g m 例如 foo match i g m gt foo foo undefined foo i match i g m gt foo
  • 文件名的正则表达式模式

    如果文件名符合以下条件 用户可以将文件放入服务器 它必须以 abc 开头 然后是一个点和一个数字 Valid file names abc 2344 abc 111 Invalid abcd 11 abc ab12 正则表达式是什么 我不能
  • .htaccess 异常导致主目录出现问题

    这是我的目录结构 localhost or livehost app bootstrap public vendor code demo 这是我的 htaccess
  • 没有特殊字符的密码验证器

    我是 RegEx 的新手 已经进行了大量搜索 但没有找到任何具体内容 我正在编写一个验证密码字符串的正则表达式 可接受的字符串必须至少具有 4 种字符类型中的 3 种 数字 小写字母 大写字母 特殊字符 我对包含有一个想法 也就是说 如果这

随机推荐