正则表达式,在单词之间找到

时间:2012-01-03 11:33:46

标签: php regex

我有一个看起来有点像

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

我想拉出xxx

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

我认为我可以做类似

的事情

找到^姓名:(那么任何数量的单词空格等,直到我到达)公司名称$ then ^公司名称:(然后任何数量的单词空格等,直到我到达)公司类型$

如果有人可以开始我,可能会有一个小的解释来帮助我更多地了解事情,例如术语“匹配”如何定义什么是匹配和什么被忽略,因为我只想要xxx部分在一个数组中所以,如果我这样做^名称:[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字段来提取不同的值由表单创建,因此“名称:”“公司名称:”等将始终相同,每个的值不会和用户输入,因此可能是任何包括空白。

编辑我的回答:

不需要注册表这是我最后所做的

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];
        }
    }
}

3 个答案:

答案 0 :(得分:1)

仅通过正则表达式执行此操作看起来有点困难和复杂。但是你可以使用正则表达式:(冒号)符号。

/[^:]*/

这将在每个冒号符号之前为您提供所有字符串。比你可以削减所有这些字符串的最后部分。例如。 If subpos of "Company Name:" !== FALSE,剪掉该字符串的最后一部分。这给了你Name的价值。

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

答案 1 :(得分: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公司名称)”和“(XXX XXX)公司名称:”

另请注意,只需preg_match即可捕获此类“行”的单个实例,而preg_match_all将有助于捕获多个“行”。

答案 2 :(得分:0)

由于xxxx和公司名称之间没有分隔符,因此分离数据并不是一个好方法。如果它是company_name,那么这可能不是一个问题。

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