【问题标题】:Php regex word lookaheadPHP正则表达式单词前瞻
【发布时间】:2014-02-16 03:51:24
【问题描述】:

我正在尝试从网页中抓取一个人的姓名,但我无法考虑是否存在中间名的可能性。例如,如果我试图匹配网页上的名称“John Smith”并且该页面的名称包含中间名(例如 John Mark Smith 或 John M Smith 或 John M. Smith 或 JohnM.Smith),即使从技术上讲,名字和姓氏在页面上一起提到,搜索也会变成空的。

是否有一个正则表达式可以在匹配名称的过程中考虑一个单词跳跃?名称在变量中:

$fullname = "John Smith";

我怎样才能做到这一点?

【问题讨论】:

  • 试试:^John.*?Smith$ 见:phpliveregex.com/p/3jf
  • 首先,到目前为止,您尝试了什么?您是尝试在整个页面内容上使用正则表达式,还是使用 DOM 解析器在某个 DOM 元素中查找此名称?
  • 我正在使用 curl 来取回页面上的文本。
  • 好吧,无论如何,.*? 部分...如果您正在抓取页面,您可能不会想要 ^$
  • alfasin 的回答不可靠,因为该页面可能包含 John Jones 和 Sam Smith。

标签: php regex


【解决方案1】:

我会试试这个(或类似的东西):
用“ ?[a-zA-Z.]* ?”替换空格
John ?[a-zA-Z\.]* ?Smith
http://www.phpliveregex.com/p/3jh

【讨论】:

  • 我认为这很好用,但是如果名称可以以稍微不同的顺序书写,那又如何呢? (M.Smith John 或 M. Smith John)?
【解决方案2】:

这个问题已经略微扩展,包括可能的相反顺序。

试试:

(John ?[\w\.]* ?Smith|Smith ?[\w\.]* ?John)

【讨论】:

    【解决方案3】:
    preg_match("/(John.*?Smith|Smith.*?John)/", $input_line, $output_array);
    

    请看这里:http://www.phpliveregex.com/p/3jj

    【讨论】:

    • 我相信这和上面 cmets 中 alfasin 的反应有同样的问题。它会匹配 John Jones Sam Smith 之类的东西
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-09-29
    • 1970-01-01
    • 2015-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多