【问题标题】:How to extract all words in a string with preg_match before a specific character如何在特定字符之前使用 preg_match 提取字符串中的所有单词
【发布时间】:2017-11-03 20:05:05
【问题描述】:

假设我们有以下字符串:

终结者1终结者2终结者3:终结者4

以及只保存 Terminator3 的给定正则表达式

(\w+)(?=:)

我必须如何将前 3 个终止符保存在一个字符串中,因为 php 的 preg_match 只提供将结果保存为数组?我正在考虑使用implode() 作为粘合所有单词的唯一选择...

示例结果:

var_dump($terminators);
array(3) {
  [0]=>
  string(11) "Terminator1"
  [1]=>
  string(11) "Terminator2"
  [2]=>
  string(11) "Terminator3"
}

提前致谢

【问题讨论】:

  • 好的,但你是指代码中的Terminators,还是anywordhere 文字,还是即将消灭我们的终结者? :)(抱歉无法抗拒)...您的编辑更清楚。谢谢!
  • 试试\G\s*\K\w+(?=(?:\s+\w+)*:)(?=(?:\s+\w+)*:) 将确保在一些空格分隔的单词之后有一个 :。如果单词之间可以有任何非单词字符,请使用\G\W*\K\w+(?=(?:\W+\w+)*:)。好吧,您可以分两步完成所有这些操作:1) 抓取 : 之前的所有单词,然后 2) explode 如果它们之间总是有空格。
  • 那么,有什么工作正常吗? 2-step suggestion demo.
  • 如果你只想从字符串的开头匹配,是的。如果没有这种需要,那就没有。然后\w+(?=(?:\s+\w+)*:) 就可以了。看看如果您没有从一开始就定义确切的要求会发生什么。

标签: php regex preg-match pcre


【解决方案1】:

我认为我不会将正则表达式用于此任务(除非您有特殊要求),因为有更快的单功能非正则表达式方法可用。

代码:(Demo)

$input='Terminator1 Terminator2 Terminator3: Terminator4';
//$input='Terminator1 Terminator2 Terminator3 Terminator4'; // no delimiter

echo "strstr: ";
var_export(strstr($input,':',true));  // false when no delimiter is found
echo "\n\n";

echo "strtok: ";
var_export(strtok($input,':'));  // fullstring when no delimiter is found
echo "\n\n";

echo "explode: ";
var_export(explode(':',$input,2)[0]);  // fullstring when no delimiter is found
echo "\n\n";

echo "preg_replace: ";
var_export(preg_replace('/:.*/','',$input));  // fullstring when no delimiter is found
echo "\n\n";

echo "preg_match: ";
var_export(preg_match('/[^:]*/',$input,$out)?$out[0]:'error');  // fullstring when no delimiter is found
echo "\n\n";

echo "preg_split: ";
var_export(preg_split('/:.*/',$input)[0]);  // fullstring when no delimiter is found

输出:

strstr: 'Terminator1 Terminator2 Terminator3'

strtok: 'Terminator1 Terminator2 Terminator3'

explode: 'Terminator1 Terminator2 Terminator3'

preg_replace: 'Terminator1 Terminator2 Terminator3'

preg_match: 'Terminator1 Terminator2 Terminator3'

preg_split: 'Terminator1 Terminator2 Terminator3'

【讨论】:

    【解决方案2】:
    $string = "Terminator1 Terminator2 Terminator3: Terminator4";
    
    $result = strtok($string, ":");
    
    echo $result;
    

    【讨论】:

    • 嗨。感谢分享。您能否添加更多上下文,为什么这可以解决问题?
    • php strtok() 将字符串一一分割,在这种情况下,我们使用“:”作为分割字符串的依据。
    【解决方案3】:

    分两步完成,

    1. 匹配[^:]+(?=:)
    2. 在空白处展开结果。

    全部完成!

    【讨论】:

      猜你喜欢
      • 2021-10-28
      • 1970-01-01
      • 2012-05-12
      • 1970-01-01
      • 2022-08-02
      • 1970-01-01
      • 2019-08-18
      • 2020-10-25
      • 1970-01-01
      相关资源
      最近更新 更多