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