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

时间:2015-04-03 21:54:26

标签: regex sed html-parsing

我正在尝试sed -i更新所有html表单以进行网址缩短。基本上我需要从所有动作中删除.php =" ..."我的html表单中的标签。

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

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

我正在使用这个表达式:

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

grep根本不会返回任何内容。

我尝试了很多变化,我甚至可以看到\ s?没有工作因为这个grep命令也没有返回任何内容:

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

(后者我试过想也许我不得不逃避\中的\。)

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

编辑:

修复1 - 显然我需要在\ s中逃避问题make?使它被视为可选字符而不是文字问号。

3 个答案:

答案 0 :(得分:1)

您使用它的方式,grep接受基本的posix正则表达式语法。单引号不需要在其中转义 1 ,但您使用的某些元字符可以进行转义 - 尤其是?()和{{1} }。你可以使用

|

但是,我建议您使用grep -R "action\s\?=\s\?\(.*\)php\(\"\|'\)" testfile grep标记来使用扩展的posix正则表达式语法:

-E

正如您所看到的,这使整个事情更具可读性。

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

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

贝壳琴弦使它看起来比它更可怕; sed代码就是

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

我稍微修改了正则表达式,以便在行s/\(action\s*=\s*["'][^"']*\)\.php\(["']\)/\1\2/g 中删除右action='foo.php' somethingelse='bar.php'。我尝试尽可能安全,但要注意使用sed处理HTML是always hacky

将其与.php及其find过滤器结合使用,以处理整个目录。

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

答案 1 :(得分:0)

尝试使用未转义的普通正则表达式,它只选择引号内的文字:

action\s?=\s?["'](.*)\.php["']
你可以在这里乱搞:

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

依此命令行,这将是:

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

答案 2 :(得分:0)

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

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