【问题标题】:Regular expression to set href parameter of anchor tags正则表达式设置锚标签的href参数
【发布时间】:2010-10-11 12:59:08
【问题描述】:

我正在寻找一种方法来查找和替换大量文本文件。例如;

我要选择;

<li><a href="">Istanbul, TR POS </a></li>
<li><a href="">Ankara, TR POS </a></li>
<li><a href="">Izmir, TR POS </a></li>

有;

<li><a href="pos-istanbul-tr.php">Istanbul, TR POS </a></li>
<li><a href="pos-ankara-tr.php">Ankara, TR POS </a></li>
<li><a href="pos-izmir-tr.php">Izmir, TR POS </a></li> 

请注意,标签的首字母是小写的,并且也作为链接的一部分添加。这应该针对大量文本文件完成,因此我正在通过正则表达式或您认为可能有帮助的任何软件寻找最有效的方法。

【问题讨论】:

  • 你在哪个平台上?有多种解决方案,但它取决于它需要在哪个操作系统上运行以了解可用的内容。
  • Windows Xp。为提交的 perl 脚本下载了 activeperl windows msi。让我们看看...

标签: regex


【解决方案1】:
$ perl -i.bak \
>  -pe's/href="">([^,]+)/\'href="pos-\'. (lc $1) . \'-tr.php">\'. $1/eg' \
>  *.html

跨平台变体(+ 基于@Jonathan Leffler's answer

保存到fill-href.pl:

#!/usr/bin/perl -w -pi.bak
s/href="">([^,]+)/href="pos-\L$1\E-tr.php">$1/g

运行:

perl fill-href.pl test1.html test2.html

【讨论】:

  • 您可能希望匹配包括结束标签在内的整个块,以防有相似但略有不同的行不被转换。
【解决方案2】:
perl -pi.bak -e 's%<li><a href="">(\W+), TR POS </a></li>%<li><a href="pos-\L$1\E-tr.php">$1, TR POS </a></li>%g;' file1 file2 ...

未经测试 - 可能过于简化,但应该适用于样本数据。 '-p' 使 Perl 打印每一行; “-i.bak”会创建一个带有“.bak”扩展名的文件的备份并覆盖原始文件。

【讨论】:

    【解决方案3】:

    如果您碰巧可以访问与 Perl 兼容的正则表达式 (PCRE) 引擎,例如 PHP 的 preg_replace(),或者甚至是 Perl,如果必须 ;-),您可以替换此正则表达式:

    <a href="">([^,]+),\s+(\w+)\s+(\w+)
    

    用这个:

    <a href="\L$3-$1-$2\E.php">$1, $2 $3
    

    \L\E 修饰符为你做小写。

    $i = '<li><a href="">Izmir, TR POS </a></li>';
    $r = '/<a href="">([^,]+),\\s+(\\w+)\\s+(\\w+)/';
    $s = '<a href="\\L$4-$2-$3\\E.php">$1, $2 $3';
    
    $o = preg_replace($r, $s, $i);
    echo $o;
    

    VI / VIM 在反向引用中具有类似的大小写处理机制。

    【讨论】:

      【解决方案4】:

      使用 textmate 正则表达式引擎,您需要的是:

      找到:

    • ([A-Za-z]+),TR POS
    • 替换:

    • $1,TR POS
    • 注意第一个替换有一个修饰符,它将第一个匹配项变为小写。第二个 $1 没有修饰符。我对其进行了测试,它完全符合您的需求。

      【讨论】:

        【解决方案5】:

        我认为您将需要编程来执行此操作,因为您想要操作匹配的文本。

        awk 听起来非常可行,如果你在一个拥有它的平台上。或者你可以用 Python、Perl 或任何你喜欢的东西来做一些事情。实际代码很可能会有其他答案。

        【讨论】:

          【解决方案6】:

          如果您使用的是 Linux,您可能会发现此线程很有帮助:

          您可以使用 sed 之类的命令行工具、Python/Perl 之类的脚本语言或任何数量的其他解决方案来执行此操作。如果您可以详细说明您正在寻找什么以及它需要在什么操作系统上运行,这将有助于提供更具体的答案。

          【讨论】:

            【解决方案7】:

            使用一些能够进行正则表达式和“在文件中搜索”的文本编辑器。 例如。编辑加

            然后替换

            &lt;li&gt;&lt;a href=""&gt;([A-Za-z]+), TR POS &lt;\/a&gt;&lt;\/li&gt;

            &lt;li&gt;&lt;a href="pos-\1-tr.php"&gt;\1, TR POS &lt;/a&gt;&lt;/li&gt;

            (可能需要更多转义,即反斜杠...)

            【讨论】:

            • 您必须解释 命令的作用。就目前而言,它看起来可疑且无益。
            • OP 要求 \1 在 "pos-\1-tr.php" 中小写。
            • @JL:正则表达式的大多数文本编辑器实现对未转义的特殊字符反应“不好”,尤其是“/”。但是我已经看到了很多不同的实现,我已经放弃了寻找通用解决方案。你必须相信我,我的版本是一个很好的第一枪。
            • @JFS:是的,你是对的,小写可能是文本编辑器正则表达式失败的部分。
            • ... 除了 textmate。那些苹果人什么都有。
            猜你喜欢
            • 1970-01-01
            • 2011-08-11
            • 2011-08-08
            • 1970-01-01
            • 2019-08-04
            • 1970-01-01
            • 2011-04-19
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多