2016-01-30 45 views
1

在文中,html代码之间找到codeStartcodeEnd单词。此代码显示为文本,并在两者之间我想标签。 preg_replace函数试图用它做,但不喜欢这样的:在两个单词之间改变句子,PHP 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

首先:'$ string'是整个文本或仅 'Codestart的(...)codeEnd' 的一部分? – fusion3k

+0

$ string:我从数据库收到的文本 –

+0

codeStart和codeEnd:一个普通的词。确定开始点和结束点 –

回答

2

,我们在您电话preg_replace 3个主要问题。

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

为测试目的写了一篇文章。下面的代码给出:
Codestart的
< A HREF = " http://www.example.com"><img SRC = " http://example.com/images.png"></a>
codeEnd
为测试文本的多写

但在这种情况下,模式搜索,因为你的模式失败是/^codeStart (\w+) codeEnd$/m:你codeEnd前加一个空格codeStart和另一个之后,但在你的字符串,这个空间的存在呢?或者是换行符?

第二个问题,(\w+)子模式:\w意味着« “字” 字»(字母,数字,下划线):所以,上面的例子中,这是不匹配的空间,<>,等...

最后但并非最不重要的,你不能说像htmlspecialcharspreg_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将接收到正则表达式的匹配,并在第一个子模式匹配中应用htmlspecialchars

+0

你做了一个很好的工作来解释他的正则表达式出了什么问题。感谢您花时间做到这一点。 – Quixrick

+0

@Quixrick不客气! – fusion3k

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; 
0

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

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

代替

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

工种

相关问题