正则表达式,查找单词之间


Regular Expression, find between words

我有一个看起来有点像

的字符串
Name: xxx xxx
Company Name: xxx xxx xx
Company Type: xxxx
Tel: xxxx
Email: xxxxxxx
Postcode: xxxxxx

我正在试着拔出xxx

我使用preg_match_all这样做,但我需要的正则表达式不是我能掌握的东西:(我一直在网上阅读各种教程,现在我理解这一切。

我想我可以这样做

查找^Name:(然后任意数量的单词空格等,直到我到达)公司名称$然后^公司名称:(然后任意数量的单词空格等,直到我到达)公司类型$

如果有人可以开始我,也许用一个小的解释来帮助我理解更多的东西,比如术语"匹配"我如何定义什么是匹配,什么是被忽略的,因为我只是想在一个数组中的xxx部分,所以如果我做^Name:[a- za - z0 -9]$会是一个匹配或只是位在[]。

致意。

编辑:添加我使用的php代码。

foreach( $value as $k => &$v ){
    if( $k == "history_date_created" ){
        $v = date( "D jS M Y @ H:i:s", strtotime($v) );
    }
    if( $k == "history_text" ){
        //Name: xxx xxxx Company Name: xxxx xxxx Company Type: xxxx xxxx Tel: xxxx xxxx Email: xxxx xxxx Postcode: xxxx xxxx To Email: xxxx xxxx Subscription: none
        $pattern = "/Name: (.*) Company Name: (.*) Company Type: (.*) Tel: (.*) Email: (.*)/U";
        preg_match_all( $pattern, $v, $matches, PREG_SET_ORDER );
        print_r( $matches );
    }
}

基本上我已经从数据库中拉了一行,不幸的是"history_text"是一个文本字段,在我看来是存储错误的,但我现在无能为力改变这一点,所以需要用regex拉不同的值,history_text字段是由一个表单创建的,所以"名称:"公司名称:"等将永远是相同的,每个的值都不会是用户输入的,所以可以是任何东西,包括空白。

我的回答:

不需要Reg Ex这就是我最后所做的

foreach( $value as $k => &$v ){
    if( $k == "history_date_created" ){
        $v = date( "D jS M Y @ H:i:s", strtotime($v) );
    }
    if( $k == "history_text" ){
        $matches = explode("'n", $v);
        foreach( $matches as $match){
            $boom = explode( ":", $match );
            $value[$boom[0]] = $boom[1];
        }
    }
}

试试这个:

preg_match_all("/Name: (.*) Company Name: (.*) Company Type: (.*) Tel: (.*) Email: (.*)/U", $x, $matches, PREG_SET_ORDER);

关于这个的一些注意事项:

  • .捕获任何单个字符-除了换行符(默认情况下除了换行)
  • *将扩展它以捕获多个字符
  • ()将捕获那些在子比赛,你也可以使用其他字符类,如果你想
  • U修饰符(在//之后)使匹配不贪婪。这有助于避免"控制文本"的匹配部分,例如,当您在一行上有多个匹配时。
  • 参数PREG_SET_ORDER通常可以更方便地遍历匹配数组,例如通过$matches[4][2]访问公司名称第5个匹配而不是$matches[2][4],使用默认的模式顺序。

编辑:我假设你知道实际的"描述术语",如"公司名称",否则将无法一般区分"(XXX XXX公司)名称:"answers"(XXX XXX)公司名称:"

还请注意,您将只需要一个preg_match来捕获这样一个'行'的单个实例,而preg_match_all将有助于捕获多个'行'。

仅通过正则表达式来完成这个操作看起来有点困难和复杂。但是您可以使用regex:(冒号)符号。

/[^:]*/

这将在每个冒号符号之前给出所有字符串。然后你就可以剪掉所有琴弦的最后一部分。如。If subpos of "Company Name:" !== FALSE,剪掉字符串的最后一部分。给你Name的值

可以对其他部分使用相同的逻辑

没有真正的好方法来分隔您的数据,因为xxxx和公司名称之间没有分隔符。如果它是company_name,那么这可能不是这样的问题。

查看正则表达式解决方案,或者使用爆炸函数(可能两次)与":"和空格" "。