You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

curl输出中匹配<textarea>内容的正则表达式失效问题求助

问题排查与解决

嘿,我来帮你理清这个问题——你的curl请求没问题,但grep命令没返回结果,是正则表达式写法错误加上grep默认不支持跨行匹配两个原因导致的,具体来看:

1. 正则里的HTML实体是多余的

你写的正则用了&lt;textarea.*&gt;,但curl直接获取到的原始HTML里,标签是原生的<textarea>,而不是转义后的&lt;textarea&gt;——&lt;是网页在显示源码时才会转义的实体,实际请求到的HTML是带尖括号的原始标签,所以这部分正则根本匹配不到任何内容。

2. grep默认逐行处理,不支持跨行匹配

就算修正了尖括号的问题,grep默认是逐行扫描文本的,而<textarea>里的ping结果肯定是跨多行的。你在regex101测试时,网站默认用了多行模式,能识别换行,但grep默认不会把多行内容当成一个整体匹配。

给你几个可行的解决办法:

方法一:用GNU grep的PCRE模式(最推荐)

GNU grep支持Perl兼容正则(PCRE),加上-P参数就能开启跨行匹配,同时用非贪婪匹配避免误抓多个标签:

curl --data "ping=8.8.8.8" -s http://www.ipvoid.com/ping/ | grep -ioP '<textarea.*?>([\s\S]*?)<\/textarea>'
  • -P:启用PCRE模式,支持跨行和非贪婪匹配(.*?)
  • [\s\S]*?:匹配任意字符(包括换行),非贪婪模式确保只匹配到当前textarea的闭合标签

如果只想提取标签里的内容(不要标签本身),可以用正则断言优化:

curl --data "ping=8.8.8.8" -s http://www.ipvoid.com/ping/ | grep -oP '(?<=<textarea.*?>)([\s\S]*?)(?=<\/textarea>)'

方法二:用pcregrep(如果系统已安装)

pcregrep是专门处理PCRE正则的工具,默认支持跨行匹配,写法更简单:

curl --data "ping=8.8.8.8" -s http://www.ipvoid.com/ping/ | pcregrep -io '<textarea.*?>([\s\S]*?)<\/textarea>'

方法三:用awk处理跨行内容

如果不想依赖PCRE工具,awk也能轻松搞定跨行捕获:

curl --data "ping=8.8.8.8" -s http://www.ipvoid.com/ping/ | awk '/<textarea.*>/ {flag=1; next} /<\/textarea>/ {flag=0} flag'
  • 原理是:匹配到<textarea>开启标签时,标记flag为1,后续行都输出;匹配到闭合标签时,flag设为0,停止输出。

内容的提问来源于stack exchange,提问作者CheckYourSec

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:14:21