在多个单词上分解字符串

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 件。