PHP:正则表达式替换字符串/ HTML标记之间的所有内容

时间:2018-02-09 17:17:40

标签: php regex

我有以下文字,但希望从字符串中删除引号位,我使用下面的正则表达式,但它给了我以下错误。

文字示例1

template<typename T>
void Dialog::Browse(vector<T> *list, int &counter, QTableWidget *table,     int column)
{
    QTableWidgetItem* item = 0;
    typename vector<T>::iterator it;
    for (it = list->begin(); it != list->end(); ++it){
        QString text;
        if (typeid(*list) == typeid(vector<string>)){
            //QString text = QString::fromUtf8(static_cast<string>(it)->c_str());
            QString text = QString::fromStdString(*it);
        } else if (typeid(*list) == typeid(vector<int>)){
            QString text = QString::number(*it);
        }

        item = new QTableWidgetItem(text);
        item->setFlags(item->flags() & ~Qt::ItemIsEditable);
        table->setItem(counter, column, item);
        counter++;
    }
}

文字示例2

<p>[quote]</p>
<p>[quote]</p>
<p>inner quote text</p>
<p>[/quote]</p>
<p>outer quote text</p>
<p>[/quote]</p>
<p>This is a test.</p>

预期文字

<p>[quote][quote]</p>
<p>inner quote text</p>
<p>[/quote]</p>
<p>outer quote text</p>
<p>[/quote]</p>
<p>This is a test.</p>

正则表达式

<p>This is a test.</p>

错误

preg_replace('/<p>\[quote\][\s\S]+?<p>\[\/quote\]<\/p>/', '', $string);

我看过Deleting text between two strings in php using preg_replace有帮助但我无法弄明白,任何帮助都非常感激。

2 个答案:

答案 0 :(得分:2)

您收到错误的原因是因为您未在正则表达式中转义开头[字符。请参阅我在下面标记的[

preg_replace('/\<p\>\[quote\]\<\/p\>[\s\S]+?\<p\>[\/quote\]\<\/p\>/', '', $string);
                                                 ^

这导致启动一个尚未关闭的字符类。你应该像这样简单地逃避这个开口支撑:

preg_replace('/\<p\>\[quote\]\<\/p\>[\s\S]+?\<p\>\[\/quote\]\<\/p\>/', '', $string);

答案 1 :(得分:0)

从HTML中提取文本很棘手,因此最好的选择是使用像Html2Text这样的库。它是专门为此目的而建的。

https://github.com/mtibben/html2text

使用composer安装:

composer需要html2text / html2text 基本用法:

$html = new \Html2Text\Html2Text('<p>[quote</p>test piece of text<p>[/quote]</p>This is a test.');

echo $html->getText();  // test piece of text This is a test.

或者您只需使用PHP strip_tags函数

即可

string strip_tags(string $ str [,string $ allowable_tags])

http://php.net/strip_tags

echo str_replace("[/quote]","",str_replace("[quote","",strip_tags("<p>
[quote</p>
test piece of text
<p>[/quote]</p>
This is a test.")));