使用正则表达式来识别 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 字符串,而不是因为正则表达式需要它。
我正在尝试使用 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 字符串,而不是因为正则表达式需要它。