我正在尝试从文本块中删除@
符号。问题是在某些情况下(在行的开头,@
符号需要保留。
我已成功使用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
答案 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
修饰符,则为字符串的开头)。
在代码中:
<?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;"
答案 2 :(得分:0)
语法[^]表示否定匹配(如不匹配),但我认为以下内容不起作用
$pattern = '/[^]^@/';