改变两个单词的句子,PHP preg_replace

时间:2016-01-30 14:22:12

标签: php preg-replace

在文字中,html代码可在 codeStart codeEnd 字词之间找到。此代码显示为文本, pre 标记显示在我想要的之间。 preg_replace试图用它做,但不是这样的:

function get_code($string)
{
  echo '<pre class="code"><p class="icon">'.
     preg_replace("/^codeStart (\w+) codeEnd$/m",
                    "htmlspecialchars('$1')",
                    $string).
    '</p></pre>';
}

示例文本如下:

  

为测试目的写了一篇文章。代码如下:

codeStart
<a href="http://www.example.com"><img src="http://example.com/images.png"></a>
codeEnd
  

为更多的测试文本而写的

3 个答案:

答案 0 :(得分:2)

preg_replace电话中有3个主要问题。

首先,你传递给函数的字符串是什么? 在提供的示例中,它似乎是:

  

为测试目的写了一篇文章。代码如下:
  Codestart的
  &lt; a href =“http://www.example.com"><img src =”http://example.com/images.png"></a&gt;
  codeEnd
  为更多的测试文本而写的

但在这种情况下,模式搜索失败,因为您的模式为/^codeStart (\w+) codeEnd$/m:您在codeStart之后放置了一个空格而在codeEnd之前放了一个空格,但在您的字符串中这个空间是否存在?或者是换行符?

第二个问题,(\w+)子模式:\w表示«“单词”字符»(字母,数字,下划线):所以,在上面的示例中,它与空格不匹配,{{1 },<等...

最后但并非最不重要的是,您无法使用>调用htmlspecialchars之类的函数;你必须使用preg_replace和用户定义的函数。

您的代码将以这种方式运行(已测试):

preg_replace_callback

在此示例中,我使用function myCallback( $matches ) { return htmlspecialchars( $matches[1] ); } function get_code( $string ) { echo '<pre class="code"><p class="icon">'. preg_replace_callback ( "/^codeStart\W(.+)\WcodeEnd$/m", "myCallback", $string ) .'</p></pre>'; } ,这意味着模式匹配任何/^codeStart\W(.+)\WcodeEnd$/后跟非单词字符,然后在第一个子模式中, 任何角色;然后,用户定义的函数codeStart接收正则表达式的匹配,并在第一个子模式匹配时应用myCallback

答案 1 :(得分:1)

好的,所以这看起来非常简单。基本上,您需要做的就是匹配codeStartcodeEnd之间的任何内容。您可以使用.*?语法来执行此操作。像这样:

`codeStart(.*?)codeEnd`

现在,如果我们将该片段放入实际脚本中,它将看起来像这样:

// SET OUR DEFAULT STRING
$string = 'codeStart
<a href="http://www.example.com"><img src="http://example.com/images.png"></a>
codeEnd';

// DO THE PREG_REPLACE
$string = trim(htmlspecialchars(preg_replace("~codeStart(.*?)codeEnd~s", '$1', $string)));

print $string;

这将输出:

&lt;a href=&quot;http://www.example.com&quot;&gt;&lt;img src=&quot;http://example.com/images.png&quot;&gt;&lt;/a&gt;

答案 2 :(得分:0)

我感谢你们两个人(@ fusion3k和@quixrick)。我得到了结果,我希望你们两个人分开编写代码。

"/^codeStart\W(.+)\WcodeEnd$/m",

而不是

"~codeStart(.*?)codeEnd~s",

工作类型