4

我正在使用 php 的preg_replace().

基本上我有 2 种可能的字符串来匹配:

  1. 你好现实世界
  2. 问候

这是我希望完成的事情:

  1. Hello </span>Real World
  2. Gree</span>tings

规则说明:如果字符串包含空格,</span>则在第一个空格字符之后插入。如果字符串不包含空格(单词),</span>则在字符串的中间插入(如果为奇数字符,则插入+/-)。

到目前为止,我想出了一个长期有效的解决方案:

<?php 
$str = "Hello Real World";
echo preg_match("/ /", $str) ? preg_replace("/ /", " </span>", $str, 1) : preg_replace("/.{" . round(strlen($str)/2) . "}/", "$0</span>", $str, 1);
?>

但是,我相信它可以通过一个更短、更优雅的正则表达式来完成,只需一次preg_replace()调用。

知道如何只用一个 preg_replace() 调用来做到这一点吗?例如:

preg_replace("/ |.{" . round(strlen($str)/2) . "}/", "$0</span>", $str, 1)
4

2 回答 2

3

正则表达式引擎不会提前知道字符串中是否有空格。尽管您确实需要多个函数,但您根本不需要正则表达式来执行此操作:

$pos = strpos($str, ' ');
if ($pos === false) {
   //No space found
   $pos = intval(strlen($str) / 2);
}
else {
   //we want to insert *after* the space
   $pos++;
}
$str = substr_replace($str, '</span>', $pos, 0);
于 2012-12-05T15:12:40.083 回答
0

不,没有一种更短更优雅的方式来做你在想的事情。正则表达式不是可以在字符串上执行无限功能的神奇工具。

我建议的一件事是你不要在任何地方使用正则表达式,因为你不需要正则表达式来查找空间。

echo strpos( ' ', $str ) === FALSE
    ? str_replace ( ' ', '</span>', $str, 1 ) /* Only replace 1 occurrence */
    : preg_replace("/.{" . round(strlen($str)/2) . "}/", "$0</span>", $str, 1);

就像文档str_replace的那样,“如果你不需要花哨的替换规则(比如正则表达式),你应该总是使用这个函数而不是 preg_replace()。”

于 2012-12-05T15:14:23.467 回答