我有以下文字,但希望从字符串中删除引号位,我使用下面的正则表达式,但它给了我以下错误。
文字示例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有帮助但我无法弄明白,任何帮助都非常感激。
答案 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])
echo str_replace("[/quote]","",str_replace("[quote","",strip_tags("<p>
[quote</p>
test piece of text
<p>[/quote]</p>
This is a test.")));