我有一个看起来有点像
的字符串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,那么这可能不是这样的问题。
查看正则表达式解决方案,或者使用爆炸函数(可能两次)与":"和空格" "。