有条件地替换字符串中的特定字符

时间:2013-08-20 15:43:13

标签: php char

我正在尝试从文本块中删除@符号。问题是在某些情况下(在行的开头,@符号需要保留。

我已成功使用RegEx模式.\@,但是当@符号被删除时,它也会删除它前面的字符。

目标:删除所有@个符号,除非@符号是该行中的第一个字符。

<?php

function cleanFile($text)
{
    $pattern = '/.\@/';
    $replacement = '%40';
    $val =  preg_replace($pattern, $replacement, $text);
    $text = $val;
    return $text;
};

$text  = ' Test: test@test.com'."\n";
$text .= '@Test: Leave the leading at sign alone'."\n";
$text .= '@Test: test@test.com'."\n";
$valResult = cleanFile($text);
echo $valResult;

?>

输出:

Test: tes%40test.com
@Test: Leave the leading at sign alone
@Test: tes%40test.com

3 个答案:

答案 0 :(得分:2)

在这种简单的情况下,不需要regexp。

function clean($source) {
    $prefix = '';
    $offset = 0;
    if( $source[0] == '@' ) {
         $prefix = '@';
         $offset = 1;
    }

    return $prefix . str_replace('@', '', substr( $source, $offset ));
}

和测试用例

$test = array( '@foo@bar', 'foo@bar' );
foreach( $test as $src ) {
    echo $src . ' => ' . clean($src) . "\n";
}

会给:

@foo@bar => @foobar
foo@bar => foobar

答案 1 :(得分:2)

可以使用正则表达式使用否定的lookbehind执行此操作:/(?<!^)@/m@符号前面有一行(如果你跳过m修饰符,则为字符串的开头)。

Regex 101 Demo

在代码中:

<?php
    $string = "Test: test@test.com\n@Test: Leave the leading at sign alone\n@Test: test@test.com;";
    $string = preg_replace("/(?<!^)@/m", "%40", $string);
    var_dump($string);
?>

输出以下内容:

string(84) "Test: test%40test.com
@Test: Leave the leading at sign alone
@Test: test%40test.com;"

Codepad demo

答案 2 :(得分:0)

语法[^]表示否定匹配(如不匹配),但我认为以下内容不起作用

$pattern = '/[^]^@/';