在文字中,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
为更多的测试文本而写的
答案 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)
好的,所以这看起来非常简单。基本上,您需要做的就是匹配codeStart
和codeEnd
之间的任何内容。您可以使用.*?
语法来执行此操作。像这样:
`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;
这将输出:
<a href="http://www.example.com"><img src="http://example.com/images.png"></a>
答案 2 :(得分:0)
我感谢你们两个人(@ fusion3k和@quixrick)。我得到了结果,我希望你们两个人分开编写代码。
"/^codeStart\W(.+)\WcodeEnd$/m",
而不是
"~codeStart(.*?)codeEnd~s",
工作类型