在多个单词上分解字符串
explode string on multiple words
有这样一个字符串:
$string = 'connector:rtp-monthly direction:outbound message:error writing data: xxxx yyyy zzzz date:2015-11-02 10:20:30';
此字符串来自用户输入。所以它永远不会有相同的顺序。这是一个输入字段,我需要将其拆分以构建数据库查询。
现在我想根据 array() 中给定的单词拆分字符串,它就像一个包含我需要在字符串中找到的单词的映射器。看起来像这样:
$mapper = array(
'connector' => array('type' => 'string'),
'direction' => array('type' => 'string'),
'message' => array('type' => 'string'),
'date' => array('type' => 'date'),
);
只有 $mapper
的键是相关的。我试过 foreach 并像这样爆炸:
$parts = explode(':', $string);
但问题是:字符串中某处可以有冒号,所以我不需要在那里爆炸。如果在映射器键之后紧跟着一个冒号,我只需要爆炸。这种情况下的映射器键是:
connector // in this case split if "connector:" is found
direction // untill "direction:" is found
message // untill "message:" is found
date // untill "date:" is found
但也请记住,用户输入可以是多种多样的。所以字符串总是会改变字符串的顺序,而 mapper array()
永远不会是相同的顺序。所以我不确定爆炸是否是正确的方法,或者我是否应该使用正则表达式。如果是的话,怎么做。
所需的结果应该是一个如下所示的数组:
$desired_result = array(
'connector' => 'rtp-monthly',
'direction' => 'outbound',
'message' => 'error writing data: xxxx yyyy zzzz',
'date' => '2015-11-02 10:20:30',
);
非常感谢您的帮助。
我们的目标是创建一个数组,其中包含我们将从字符串中提取的两个数组的值。有两个数组是必要的,因为我们希望考虑两个字符串分隔符。
试试这个:
$parts = array();
$large_parts = explode(" ", $string);
for($i=0; $i<count($large_parts); $i++){
$small_parts = explode(":", $large_parts[$i]);
$parts[$small_parts[0]] = $small_parts[1];
}
$parts
现在应该包含所需的数组
希望你能顺利解决。
您可以结合使用正则表达式和 explode()
。考虑以下代码:
$str = "connector:rtp-monthly direction:outbound message:error writing data date:2015-11-02";
$regex = "/([^:\s]+):(\S+)/i";
// first group: match any character except ':' and whitespaces
// delimiter: ':'
// second group: match any character which is not a whitespace
// will not match writing and data
preg_match_all($regex, $str, $matches);
$mapper = array();
foreach ($matches[0] as $match) {
list($key, $value) = explode(':', $match);
$mapper[$key][] = $value;
}
此外,您可能想首先考虑一种更好的方法来存储字符串(JSON?XML?)。
给你。正则表达式是 "catch" 键(任何字符序列,不包括空白 space 和“:”)。从那里开始,我使用 "explode" 到 "recursively" 拆分字符串。经过测试的广告效果很好
$string = 'connector:rtp-monthly direction:outbound message:error writing data date:2015-11-02';
$element = "(.*?):";
preg_match_all( "/([^\s:]*?):/", $string, $matches);
$result = array();
$keys = array();
$values = array();
$counter = 0;
foreach( $matches[0] as $id => $match ) {
$exploded = explode( $matches[ 0 ][ $id ], $string );
$keys[ $counter ] = $matches[ 1 ][ $id ];
if( $counter > 0 ) {
$values[ $counter - 1 ] = $exploded[ 0 ];
}
$string = $exploded[ 1 ];
$counter++;
}
$values[] = $string;
$result = array();
foreach( $keys as $id => $key ) {
$result[ $key ] = $values[ $id ];
}
print_r( $result );
其中比较棘手的部分是匹配原始字符串。您可以在 lookahead positive assertions:
的帮助下使用正则表达式来完成
$pattern = "/(connector|direction|message|date):(.+?)(?= connector:| direction:| message:| date:|$)/";
$subject = 'connector:rtp-monthly direction:outbound message:error writing data: xxxx yyyy zzzz date:2015-11-02 10:20:30';
preg_match_all($pattern, $subject, $matches, PREG_SET_ORDER );
$returnArray = array();
foreach($matches as $item)
{
$returnArray[$item[1]] = $item[2];
}
在此正则表达式 /(connector|direction|message|date):(.+?)(?= connector:| direction:| message:| date:|$)/
中,您正在匹配:
(connector|direction|message|date)
- 找到关键字并捕获它;
:
- 后跟一个冒号;
(.+?)
- 后面任意字符多次非贪心,捕获;
(?= connector:| direction:| message:| date:|$)
- 直到下一个关键字或字符串的末尾,使用非捕获前瞻肯定断言。
结果是:
Array
(
[connector] => rtp-monthly
[direction] => outbound
[message] => error writing data: xxxx yyyy zzzz
[date] => 2015-11-02 10:20:30
)
我没有使用 mapper 数组只是为了让示例更清楚,但您可以使用 implode
将关键字放在一起。
在 PHP
中使用 preg_split() 由多个定界符进行 explode()
这里只是一个简短的说明。要 explode() 在 PHP 中使用多个定界符的字符串,您将不得不使用正则表达式。使用竖线分隔分隔符。
$string = 'connector:rtp-monthly direction:outbound message:error writing data: xxxx yyyy zzzz date:2015-11-02 10:20:30';
$chunks = preg_split('/(connector|direction|message)/',$string,-1, PREG_SPLIT_NO_EMPTY);
// Print_r to check response output.
echo '<pre>';
print_r($chunks);
echo '</pre>';
PREG_SPLIT_NO_EMPTY – 到 return 只有 non-empty 件。
有这样一个字符串:
$string = 'connector:rtp-monthly direction:outbound message:error writing data: xxxx yyyy zzzz date:2015-11-02 10:20:30';
此字符串来自用户输入。所以它永远不会有相同的顺序。这是一个输入字段,我需要将其拆分以构建数据库查询。
现在我想根据 array() 中给定的单词拆分字符串,它就像一个包含我需要在字符串中找到的单词的映射器。看起来像这样:
$mapper = array(
'connector' => array('type' => 'string'),
'direction' => array('type' => 'string'),
'message' => array('type' => 'string'),
'date' => array('type' => 'date'),
);
只有 $mapper
的键是相关的。我试过 foreach 并像这样爆炸:
$parts = explode(':', $string);
但问题是:字符串中某处可以有冒号,所以我不需要在那里爆炸。如果在映射器键之后紧跟着一个冒号,我只需要爆炸。这种情况下的映射器键是:
connector // in this case split if "connector:" is found
direction // untill "direction:" is found
message // untill "message:" is found
date // untill "date:" is found
但也请记住,用户输入可以是多种多样的。所以字符串总是会改变字符串的顺序,而 mapper array()
永远不会是相同的顺序。所以我不确定爆炸是否是正确的方法,或者我是否应该使用正则表达式。如果是的话,怎么做。
所需的结果应该是一个如下所示的数组:
$desired_result = array(
'connector' => 'rtp-monthly',
'direction' => 'outbound',
'message' => 'error writing data: xxxx yyyy zzzz',
'date' => '2015-11-02 10:20:30',
);
非常感谢您的帮助。
我们的目标是创建一个数组,其中包含我们将从字符串中提取的两个数组的值。有两个数组是必要的,因为我们希望考虑两个字符串分隔符。 试试这个:
$parts = array();
$large_parts = explode(" ", $string);
for($i=0; $i<count($large_parts); $i++){
$small_parts = explode(":", $large_parts[$i]);
$parts[$small_parts[0]] = $small_parts[1];
}
$parts
现在应该包含所需的数组
希望你能顺利解决。
您可以结合使用正则表达式和 explode()
。考虑以下代码:
$str = "connector:rtp-monthly direction:outbound message:error writing data date:2015-11-02";
$regex = "/([^:\s]+):(\S+)/i";
// first group: match any character except ':' and whitespaces
// delimiter: ':'
// second group: match any character which is not a whitespace
// will not match writing and data
preg_match_all($regex, $str, $matches);
$mapper = array();
foreach ($matches[0] as $match) {
list($key, $value) = explode(':', $match);
$mapper[$key][] = $value;
}
此外,您可能想首先考虑一种更好的方法来存储字符串(JSON?XML?)。
给你。正则表达式是 "catch" 键(任何字符序列,不包括空白 space 和“:”)。从那里开始,我使用 "explode" 到 "recursively" 拆分字符串。经过测试的广告效果很好
$string = 'connector:rtp-monthly direction:outbound message:error writing data date:2015-11-02';
$element = "(.*?):";
preg_match_all( "/([^\s:]*?):/", $string, $matches);
$result = array();
$keys = array();
$values = array();
$counter = 0;
foreach( $matches[0] as $id => $match ) {
$exploded = explode( $matches[ 0 ][ $id ], $string );
$keys[ $counter ] = $matches[ 1 ][ $id ];
if( $counter > 0 ) {
$values[ $counter - 1 ] = $exploded[ 0 ];
}
$string = $exploded[ 1 ];
$counter++;
}
$values[] = $string;
$result = array();
foreach( $keys as $id => $key ) {
$result[ $key ] = $values[ $id ];
}
print_r( $result );
其中比较棘手的部分是匹配原始字符串。您可以在 lookahead positive assertions:
的帮助下使用正则表达式来完成$pattern = "/(connector|direction|message|date):(.+?)(?= connector:| direction:| message:| date:|$)/";
$subject = 'connector:rtp-monthly direction:outbound message:error writing data: xxxx yyyy zzzz date:2015-11-02 10:20:30';
preg_match_all($pattern, $subject, $matches, PREG_SET_ORDER );
$returnArray = array();
foreach($matches as $item)
{
$returnArray[$item[1]] = $item[2];
}
在此正则表达式 /(connector|direction|message|date):(.+?)(?= connector:| direction:| message:| date:|$)/
中,您正在匹配:
(connector|direction|message|date)
- 找到关键字并捕获它;:
- 后跟一个冒号;(.+?)
- 后面任意字符多次非贪心,捕获;(?= connector:| direction:| message:| date:|$)
- 直到下一个关键字或字符串的末尾,使用非捕获前瞻肯定断言。
结果是:
Array
(
[connector] => rtp-monthly
[direction] => outbound
[message] => error writing data: xxxx yyyy zzzz
[date] => 2015-11-02 10:20:30
)
我没有使用 mapper 数组只是为了让示例更清楚,但您可以使用 implode
将关键字放在一起。
在 PHP
中使用 preg_split() 由多个定界符进行 explode()这里只是一个简短的说明。要 explode() 在 PHP 中使用多个定界符的字符串,您将不得不使用正则表达式。使用竖线分隔分隔符。
$string = 'connector:rtp-monthly direction:outbound message:error writing data: xxxx yyyy zzzz date:2015-11-02 10:20:30';
$chunks = preg_split('/(connector|direction|message)/',$string,-1, PREG_SPLIT_NO_EMPTY);
// Print_r to check response output.
echo '<pre>';
print_r($chunks);
echo '</pre>';
PREG_SPLIT_NO_EMPTY – 到 return 只有 non-empty 件。