我有一个字符串:
tomato='36'/></carrot
由此我尝试使用正则表达式提取36
。我正在使用:
"/tomato='(.*)'\/>/"
这提取开始确定,但不提取其余部分。任何想法如何解决这个问题?
答案 0 :(得分:1)
您应该专注于正则表达式,以便只匹配数字字符:
"/tomato='(\d+)'\/>/"
答案 1 :(得分:0)
以下是一些有助于构建正则表达式的工具:https://stackoverflow.com/questions/89718/is-there-anything-like-regexbuddy-in-the-open-source-world
在您的情况下,您可能希望匹配\d+
小数。
根据实际使用情况,如果您不使用regexp,可能会更简单,但是DOM解析器(1)可以简化属性提取:
pq($xml)->find("recipe")->attr("tomato");
答案 2 :(得分:0)
鉴于您提供的非常具体的示例,以及您要提取的特定数据,它非常简单;你的正则表达式可以忽略除数字字符以外的所有内容:
"/\d+/"
如果输入字符串可能有所不同,并且您特别想要找到tomato
属性的值,那么:
"/tomato='(\d+)'/"
不太可能真正需要匹配字符串的其余部分 - 实际上,考虑到XML的变量,它更可能导致问题。
但问题是,你究竟想在这做什么?它看起来非常像你正在尝试解析HTML / XML流,但你是如何最终得到这个奇怪的块?你做过explode(' ',$xml);
吗?
您可能会发现从XML流中提取数据的更具可扩展性和可管理性的方法是使用DOM解析器。正则表达式可以工作,但HTML / XML往往有足够的格式变化,如果你想确定获得你想要的数据,你最终得到一些非常可怕的正则表达式字符串;在这方面,DOM解析器往往更加可靠。
我建议您研究一下PHP的内置DOM解析器:http://www.php.net/dom
希望有所帮助。
答案 3 :(得分:0)
尝试匹配第一个引号,然后抓取所有不是引号字符的内容:
/tomato='([^']*)'/
如果您不知道引号之间的内容,此方法很有效,但如果最终引号丢失,或者您使用双引号而不是单引号,则此方法会失败。