怀疑PHP中的正则表达式

时间:2011-06-18 17:46:17

标签: php regex

我有一个愚蠢的怀疑:

假设我有这样一行

Heading: Value1; SomeText1 (a, b, c), Value 2; SomeText2 (d, e, f)

我想删除所有分号并删除括号中的所有内容(包括括号)。我设法使用此代码

执行此操作
if (strstr($line,'Heading')){
                $new_heading = str_replace(";", "", $line); // Replaces semi-colon
                $new_heading = preg_replace("/\([^\)]+\)/","",$new_heading); //Removes Text With in Brackets
                $line = $new_heading;
                echo $line; //Outputs "Heading: Value1 SomeText1 , Value 2 SomeText2"
                } 

现在假设我有一条这样的行

Heading: Text1 (a, b) Text2. (d, f) Text3 (g, h)

我想要实现的是......用括号(包含括号)删除所有内容并用逗号替换它。但是,括号的最后一次使用不应该用逗号替换。

我的意思是输出应该是

Heading: Text1 , Text2. , Text3

如何实现这个目标?

7 个答案:

答案 0 :(得分:1)

如果您只想删除尾随逗号,可以使用substr ...

$newstr = substr($str, 0, strlen($str)-1);  

像这样......

编辑产品:>好的,试着再次回答这个问题......这会有用吗?

$new_heading = preg_replace("/\([^\)]+\)/",",",$new_heading);
$newstr = substr($new_heading, 0, strlen($str)-1);  

编辑产品:>在回复您的评论如下。谢谢:)我没有真正使用一本书,只有RegxLib

答案 1 :(得分:1)

(更新)试试这个,

$text = "Heading: Text1 (a, b) Text2. (d, f) Text3 (g, h)";

preg_match_all("/\([^\)]+\)/",$text, $brackets);

$bracket_c = count($brackets);

for($bracket_i = 0; $bracket_i < $bracket_c; $bracket_i += 1){
    if($bracket_i == $bracket_c - 1){
        $text = str_replace($brackets[$bracket_i], "", $text);
    }else{
        $text = str_replace($brackets[$bracket_i], ",", $text);
    }
}
echo $text . "\n";

答案 2 :(得分:1)

如果查看preg_replace()的定义,则会有一个名为$limit的参数。以下是解决问题的步骤:

  1. 使用preg_match_all计算括号
  2. 在preg_replace中使用该数字 - 1并用逗号替换括号
  3. 再次使用preg_replace用空字符串替换最后一个括号
  4. 代码:

    preg_match_all("/\([^\)]+\)/",$new_heading,$matches);
    $new_heading = preg_replace("/\([^\)]+\)/",",",$new_heading, count($matches) - 1);
    $new_heading = preg_replace("/\([^\)]+\)/","",$new_heading);
    

    <强>替代:

    1. 像以前一样使用preg_replace,但不存储结果。仅使用$count的值,这是第五个参数。
    2. 在preg_replace中使用该数字 - 1并用逗号替换括号
    3. 再次使用preg_replace用空字符串替换最后一个括号
    4. 代码:

      preg_replace("/\([^\)]+\)/","",$new_heading, null, $count);
      $new_heading = preg_replace("/\([^\)]+\)/",",",$new_heading, $count - 1);
      $new_heading = preg_replace("/\([^\)]+\)/","",$new_heading);
      

答案 3 :(得分:0)

你能用两个表达式吗?

$text = "Heading: Text1 (a, b) Text2. (d, f) Text3 (g, h)";

$new = preg_replace("/\([^)]*\)(?=.*?\([^)]*\))/",",",$text);
$new = preg_replace("/\([^)]*\)/","",$new);

echo $new . "\n";

第一个用逗号替换所有实例但是最后一个实例。最后一个实例(g, h)仍然存在。然后第二个表达式用空字符串替换所有剩余的实例(只有一个)。

答案 4 :(得分:0)

<?php
$line = 'Heading: Text1 (a, b) Text2. (d, f) Text3 (g, h)';
$line = substr(preg_replace('/\([^\)]+\)/', ',', $line), 0, -1);
?>

或者你可以使用两个正则表达式:

<?php
$line = 'Heading: Text1 (a, b) Text2. (d, f) Text3 (g, h)';
$line = preg_replace('/ \([^\)]+\)$/', '', $line);
$line = preg_replace('/\([^\)]+\)/', ',', $line);
?>

但这太过分了。使用一个正则表达式来简化。

答案 5 :(得分:0)

这可能看起来效率低下但会解决您的问题。战略是

  • 使用preg_match查找号码 模式的出现,在这种情况下是括号并说出它 n
  • 使用preg_replace替换 逗号出现n-1括号 将limit参数设置为n-1
  • 使用preg_replace替换该集 括号中的空字符串

答案 6 :(得分:0)

使用这样的代码:

$str = 'Text1 (a, b) Text2. (d, f) Text3 (g, h)';
$arr = preg_split('~\([^)]*\)~', $str, -1 , PREG_SPLIT_NO_EMPTY);
var_dump(implode(',', $arr));

输出

string(23) "Text1 , Text2. , Text3 "