使用正则表达式来识别 html 表单操作标签

use regular expressions to identify html form action tags

我正在尝试使用 sed -i 更新我所有的 html 表格以缩短 url。基本上我需要从我的 html 表单中的所有 action="..." 标签中删除 .php。

但我只是停留在识别这些实例上。我正在尝试这个测试文件:

action = "yo.php"
action = 'test.php'
action='test.php'
action="upup.php"

我正在使用这个表达式:

grep -R "action\s?=\s?(.*)php(\"|\')" testfile

而 grep returns 什么也没有。

我尝试了很多变体,我可以看到即使是 \s?不起作用,因为只有这个 grep 命令也 returns 没有:

 grep -R "action\s?=\s?" testfile
grep -R "action\s?=\s?" testfile

(后者我试着想也许我不得不在 \s 中转义 \)。

有人能告诉我这些命令有什么问题吗?

编辑:

修复 1 - 显然我需要转义 \s?使其被视为可选字符而不是文字问号。

试试这个未转义的纯正则表达式,它只选择引号内的文本:

action\s?=\s?["'](.*)\.php["']

你可以 fiddle 在这里:

https://regex101.com/r/lN8iG0/1

命令行 上,这将是:

grep -P "action\s?=\s?[\"'](.*)\.php[\"']" test

您需要使用 -P 选项才能使用 Perl 正则表达式:

$ grep -P "action\s?=\s?(.*)php(\"|\')" test
action = "yo.php"
action = 'test.php'
action='test.php'
action="upup.php"

您使用它的方式,grep 接受基本的 posix 正则表达式语法。其中的单引号不需要转义 1,但您使用的一些元字符需要转义——特别是 ?()|。您可以使用

grep -R "action\s\?=\s\?\(.*\)php\(\"\|'\)" testfile

不过,我建议您使用扩展的 posix 正则表达式语法,方法是给 grep -E 标志:

grep -E -R "action\s?=\s?(.*)php(\"|')" testfile

如您所见,这使整个内容更具可读性。

附录:要从文件中的所有操作属性中删除 .php 扩展名,您可以使用

sed -i 's/\(action\s*=\s*["'\''][^"'\'']*\)\.php\(["'\'']\)//g' testfile

Shell 字符串让这看起来比实际更可怕; sed 代码只是

s/\(action\s*=\s*["'][^"']*\)\.php\(["']\)//g

我稍微修改了正则表达式,以便在行 action='foo.php' somethingelse='bar.php' 中删除右边的 .php。我尽量使它尽可能安全,但请注意,使用 sed 处理 HTML 是 always hacky.

将此与 find 及其 -exec 过滤器结合使用以处理整个目录。

1 而双引号需要转义是因为您使用了双引号 shell 字符串,而不是因为正则表达式需要它。