0

我试图让我的 PHP 代码从包含属性 data-class="false" 的链接中删除 class="something" 并保留其他链接。

$mytext = 'text text text <a href="/url" data-class="false" class="something">
link1</a> text text text <a href="/url" class="something">link2</a> text text 
text <a href="/url" class="something" data-class="false">link3</a> text text 
text';

// This function is supposed to remove the class="something" string from matches.
function remove_class($matches) {
  return str_replace(' class="something"','', $matches[1]);
}

// Match any link that contains the data-class="false" string and do callback.
$mytext = preg_replace_callback('/<a.*?data-class="false".*?>/', 
'remove_class', $mytext);

echo $mytext;

期望的结果如下:(注意在 data-class="false" 存在的地方删除了该类)

text text text <a href="/url" data-class="false">link1</a> text text text
<a href="/url" class="something">link2</a> text text text
<a href="/url" data-class="false">link3</a> text text text
4

2 回答 2

0

这应该工作

$mytext = 'text text text <a href="/url" data-class="false" class="something">
link1</a> text text text <a href="/url" class="something">link2</a> text text 
text <a href="/url" class="something" data-class="false">link3</a> text text 
text';     
$mytext2=  str_replace('data-class="false" class="something"','data-class="false"', $mytext );
$mytext3=  str_replace('class="something" data-class="false"','data-class="false"', $mytext2 );
echo htmlentities($mytext3);
于 2013-11-09T07:23:38.853 回答
0

从您显示的代码中,我没有看到使用的理由preg_replace_callbackpreg_replace应该足够了。

$mytext = 'text text text <a href="/url" data-class="false" class="something">
link1</a> text text text <a href="/url" class="something">link2</a> text text 
text <a href="/url" class="something" data-class="false">link3</a> text text 
text';

// Match any link that contains the data-class="false" and class="something" 
// Then removes class="something".
$mytext = preg_replace('/(<a.*?)(class="something")\s(.*?data-class="false".*?>)|(<a.*?)(data-class="false".*?)\s(class="something")(.*?>)/', 
'$1$3$4$5$7', $mytext);

echo $mytext;

将输出:

text text text <a href="/url" data-class="false">
link1</a> text text text <a href="/url" class="something">link2</a> text text 
text <a href="/url" data-class="false">link3</a> text text 
text

发生的事情是preg_replace匹配class="something" data-class="false"OR data-class="false" class="something"。每个子模式 (...) 都可以通过 $ 和子模式的编号来引用。如果我们的前三个子模式被找到,那么我们使用 $1$3 忽略 $2,只用我们想要的子模式匹配替换匹配。由于子模式 $4-$7 我们没有使用它们被忽略,反之亦然,如果我们匹配 $4-$7。通过\s省略子模式,我们将摆脱额外的空间。

于 2013-11-09T07:28:58.600 回答