热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

正则表达式问题:将此模式与硬引号或软引号匹配-RegexQuestion:Matchingthispatternwithhardorsoftquotes

Ihavethisanchorlocatingregexworkingprettywell:我有这个锚定位正则表达式工作得很好:$p%<a.*\s+name(.

I have this anchor locating regex working pretty well:

我有这个锚定位正则表达式工作得很好:

$p = '%(?:.*)%im';

It matches followed by zero or more of anything followed by a space and name="

它匹配

It is grabbing the names even if a class or an id precedes the name in the anchor.

即使一个类或一个id在锚点中的名称前面,它也会抓取名称。

What I would like to add is the ability to match on name=' with a single quote (') as well since sooner or later someone will have done this.

我想要添加的是能够匹配name ='和单引号('),因为迟早有人会这样做。

Obviously I could just add a second regex written for this but it seems inelegant.

显然我可以为此添加第二个正则表达式,但它看起来不够优雅。

Anyone know how to add the single quote and just use one regex? Any other improvements or recommendations would be very welcome. I can use all the regex help I can get!

任何人都知道如何添加单引号并只使用一个正则表达式?任何其他改进或建议都将非常受欢迎。我可以使用我能得到的所有正则表达式帮助!

Thanks very much for reading,

非常感谢阅读,

function findAnchors($html) {
    $names = array();
    $p = '%(?:.*)%im';
    $t = preg_match_all($p, $html, $matches, PREG_SET_ORDER);
    if ($matches) {
        foreach ($matches as $m) {
            $names[] = $m[1];
        }
        return $names;
    }
}

5 个解决方案

#1


Try this:

/]+(?:"[^"]*"|'[^']*')?)*\s+name=("[^"]*"|'[^']*')\s*>/im

Here you just have to strip the surrounding quotes:

在这里你只需要删除周围的引号:

substr($match[1], 1, -1)

But using a real parser like DOMDocument would be certainly better that this regular expression approach.

但是使用像DOMDocument这样的真正解析器肯定会比这种正则表达式方法更好。

#2


James' comment is actually a very popular, but wrong regex used for string matching. It's wrong because it doesn't allow for escaping of the string delimiter. Given that the string delimiter is ' or " the following regex works

詹姆斯的评论实际上是一个非常流行的,但用于字符串匹配的错误正则表达式。这是错误的,因为它不允许转义字符串分隔符。鉴于字符串分隔符是'或',以下正则表达式起作用

$regex = '([\'"])(.*?)(.{0,2})(?

\1 is the starting delimeter, \2 is the contents (minus 2 characters) and \3 is the last 2 characters and the ending delimiter. This regex allows for escaping of delimiters as long as the escape character is \ and the escape character hasn't been escaped. IE.,

\ 1是起始分隔符,\ 2是内容(减2个字符),\ 3是最后2个字符和结束分隔符。只要转义字符为\且转义字符未被转义,此正则表达式就允许转义分隔符。 IE浏览器。,

'Valid'
'Valid \' String'
'Invalid ' String'
'Invalid \\' String'

#5


Here's another approach:

这是另一种方法:

$rgx='~name()|\w+)=(?|"([^"]*)"|\'([^\']*)\'))+?\1~i';

I know this question is old, but when it resurfaced just now I thought up another use for the "empty capturing groups as checkboxes" idiom from the Cookbook. The first, non-capturing group handles the matching of all "name=value" pairs under the control of a reluctant plus (+?). If the attribute name is literally name, the empty group (()) matches nothing, then the backreference (\1) matches nothing again, breaking out of the loop. (The backreference succeeds because the group participated in the match, even though it didn't consume any characters.)

我知道这个问题已经过时了,但是当它刚刚重新浮出水面时,我想到了另一个用于“空白捕获组作为复选框”的习惯用法。第一个非捕获组在不情愿的加号(+?)的控制下处理所有“名称=值”对的匹配。如果属性名称实际上是名称,则空组(())不匹配任何内容,然后反向引用(\ 1)再次匹配任何内容,从而突破循环。 (后向引用成功,因为该组参与了匹配,即使它没有消耗任何字符。)

The attribute value is captured each time in group #2, overwriting whatever was captured on the previous iteration. (The branch-reset construct ((?|(...)|(...)) enables us to "re-use" group #2 to capture the value inside the quotes, whichever kind of quotes they were.) Since the loop quits after the name name comes up, the final captured value corresponds to that attribute.

每次在组#2中捕获属性值,覆盖在先前迭代中捕获的任何内容。 (branch-reset构造((?|(...)|(...))使我们能够“重用”组#2来捕获引号内的值,无论它们是什么类型的引号。)名称出现后循环退出,最终捕获的值对应于该属性。

See a demo on Ideone

查看Ideone上的演示


推荐阅读
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • 本文详细介绍了GetModuleFileName函数的用法,该函数可以用于获取当前模块所在的路径,方便进行文件操作和读取配置信息。文章通过示例代码和详细的解释,帮助读者理解和使用该函数。同时,还提供了相关的API函数声明和说明。 ... [详细]
  • GetWindowLong函数
    今天在看一个代码里头写了GetWindowLong(hwnd,0),我当时就有点费解,靠,上网搜索函数原型说明,死活找不到第 ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • 本文介绍了一种在PHP中对二维数组根据某个字段进行排序的方法,以年龄字段为例,按照倒序的方式进行排序,并给出了具体的代码实现。 ... [详细]
  • Android实战——jsoup实现网络爬虫,糗事百科项目的起步
    本文介绍了Android实战中使用jsoup实现网络爬虫的方法,以糗事百科项目为例。对于初学者来说,数据源的缺乏是做项目的最大烦恼之一。本文讲述了如何使用网络爬虫获取数据,并以糗事百科作为练手项目。同时,提到了使用jsoup需要结合前端基础知识,以及如果学过JS的话可以更轻松地使用该框架。 ... [详细]
  • 本文介绍了2015年九月八日的js学习总结及相关知识点,包括参考书《javaScript Dom编程的艺术》、js简史、Dom、DHTML、解释型程序设计和编译型程序设计等内容。同时还提到了最佳实践是将标签放到HTML文档的最后,并且对语句和注释的使用进行了说明。 ... [详细]
  • 简述在某个项目中需要分析PHP代码,分离出对应的函数调用(以及源代码对应的位置)。虽然这使用正则也可以实现,但无论从效率还是代码复杂度方面考虑ÿ ... [详细]
  • Hibernate延迟加载深入分析-集合属性的延迟加载策略
    本文深入分析了Hibernate延迟加载的机制,特别是集合属性的延迟加载策略。通过延迟加载,可以降低系统的内存开销,提高Hibernate的运行性能。对于集合属性,推荐使用延迟加载策略,即在系统需要使用集合属性时才从数据库装载关联的数据,避免一次加载所有集合属性导致性能下降。 ... [详细]
  • Jquery 跨域问题
    为什么80%的码农都做不了架构师?JQuery1.2后getJSON方法支持跨域读取json数据,原理是利用一个叫做jsonp的概念。当然 ... [详细]
  • 本文整理了Java中org.gwtbootstrap3.client.ui.Icon.addDomHandler()方法的一些代码示例,展示了Icon.ad ... [详细]
  • ps:写的第一个,不足之处,欢迎拍砖---只是想用自己的方法一步步去实现一些框架看似高大上的小功能(比如说模型中的toArraytoJsonsetAtt ... [详细]
author-avatar
中华oc博弈网络志
这个家伙很懒,什么也没留下!