2

我有一个需要从 iOS 应用程序解析字符串文件的网络应用程序。我正在尝试在一个字符串中查找所有反斜杠转义实例(\n、\t、\ 等),并在 PHP 中为它们添加一个跨度类。例如,

"Hello my name is Jim. \nI have \t12\tdogs"

应该变成:

"Hello my name is Jim.<span class='b'>\n</span> and I have <span class='b'>\t</span>12<span class='b'>\t</span>dogs"

不幸的是,我的正则表达式技能已经过时了。我不知道如何不仅替换转义符,而且在保留它们的同时在每一侧添加文本。我怎样才能正确有效地做到这一点?(可能会一次解析 1000 多个字符串)

编辑:澄清一下,我想替换任何可能的转义字符,而不仅仅是 t 和 n。所以任何以 '\' 开头的 2 字符集,包括 '\\'

4

4 回答 4

4

这在没有正则表达式的情况下是可能的,这对您的速度要求很有好处。一个简单的str_replace工作:

$string = "Hello my name is Jim. \nI have \t12\tdogs";

$newString = str_replace(
    array("\\t", "\\n"), 
    array("<span class=\"b\">\\t</span>", "<span class=\"b\">\\n</span>"), 
    $string
);
于 2013-05-31T21:02:00.860 回答
1

来自关于转义字符的 PHP 文档:

单引号和双引号 PHP 字符串具有反斜杠的特殊含义。因此,如果 \ 必须与正则表达式 \\ 匹配,则在 PHP 代码中必须使用“\\\\”或“\\\\”。

这是一个例子preg_replace。速度对于这个脚本来说不是问题。

$string = 'Hello my name is Jim. \nI have 1\\\2 of \t12\tdogs\r\n';
$pattern = '!(\\\\t|\\\\n|\\\\r|\\\\v|\\\\e|\\\\f|\\\\$|\\\\"|\\\\\\\\|\\\\\\\\\\\\\\\\|\\\\\\\\\\\\)!';
$replacement = "<span class='b'>$1</span>";
$string = preg_replace($pattern,$replacement,$string);
echo "<pre>$string</pre>";

输出

<pre>Hello my name is Jim. <span class='b'>\n</span>I have 1<span class='b'>\\</span>2 of <span class='b'>\t</span>12<span class='b'>\t</span>dogs<span class='b'>\r</span><span class='b'>\n</span></pre>
于 2013-05-31T21:22:06.383 回答
0
$newString = preg_replace('/(\\\\\S)/', '<span class="b">$1</span>', $oldString);

需要注意的一点是,当您\\在 PHP 字符串中使用时,生成的字符串实际上包含一个\. \\\并且\\\\都会导致\\.

例子

于 2013-05-31T22:26:40.643 回答
0

我认为这可能会对您有所帮助:

如果你想匹配不可打印的字符和反斜杠试试这个:

$newString = preg_replace('/[\s\a\e\\]/', '<span class="b">$1</span>', $oldString);

但是如果你想匹配所有以反斜杠和 "\x**" 格式开头的可打印 alpahnum 字符,试试这个:

$newString = preg_replace('/\\[^[:punct:]\s]|\\\\|\\x[a-fA-F0-9]{1,2}/', '<span class="b">$1</span>', $oldString); 

这匹配反斜杠后的所有字符期望标点符号和字符,如 \x23,\xAF ...

于 2013-06-01T15:06:40.363 回答