2012-01-03 34 views
0

之间找我有一个字符串,它看起来有点像正则表达式,也就是说

Name: xxx xxx 
Company Name: xxx xxx xx 
Company Type: xxxx 
Tel: xxxx 
Email: xxxxxxx 
Postcode: xxxxxx 

我试图拔出XXX

我使用preg_match_all这样做,但正则表达式,我需要是不是我能掌握:(我一直在阅读各地的网络各种教程,现在我明白这一切较少。

我相信我可以做类似

找到^姓名:(然后任何数量的字空格等到我到)公司名称$然后^公司名称:(然后任何数量的字空格等,直到我到)公司类型$

如果有人可以开始我,也许有一个小的解释,以帮助我更多地理解事情,比如术语“匹配”,我如何定义什么是匹配和什么被忽略,因为我只想要一个数组中的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”是一个文本字段,在我看来是存储错误的,但我也没有办法,现在改变这种做法,需要正则表达式来拉不同的值,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]; 
     } 
    } 
} 

回答

1

试试这个:

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

一些注意这一点:

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

编辑:我假设你知道实际的“描述条款”,如“公司名称”,否则将不可能一般区分“(XXX XXX Company)Name:”和“(XXX XXX)Company名称:“

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

+0

你所做的一切确实对我有意义,但不幸的是它只返回空的空数组。我将在上面添加一段我的php代码。 – 2012-01-03 11:59:10

+0

该模式适用于我使用您在提供正确数组的注释中提供的字符串。 (虽然它不完整,我会离开添加邮政编码等给你...)。但是,在XXX部分中不能有换行符,如果您需要添加's'修饰符。 – Zulan 2012-01-03 12:08:03

+0

啊我的错误,认为事情变得最终变得简单大声了! 我向你展示了没有nl2br的php输出中的字符串,所以对我来说它似乎全部在一行上infact它并不是每个项目都在它自己的行上似乎是 – 2012-01-03 12:36:06

1

它看起来有点艰难和复杂的仅正则表达式来做到这一点做到了。但是你可以使用正则表达式来表示:(冒号)符号。

/[^:]*/

这会给你的每个冒号前的所有字符串。比你可以削减所有这些字符串的最后部分。例如。 If subpos of "Company Name:" !== FALSE,剪下该字符串的最后部分。这给你名字的价值。

您可以对其他零件使用相同的逻辑。

0

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

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

相关问题