我有一个包含HTML和一些占位符的字符串。
占位符始终以{{
开头,以}}
结尾。
我试图对占位符的内容进行编码,然后对其进行解码。
虽然他们进行了编码,但理想情况下需要使用有效的HTML,因为我想在字符串上使用DOMDocument而我遇到的问题是它最终会变得混乱,因为占位符通常是某种东西像:
<img src="{{image url="mediadir/someimage.jpg"}}"/>
有时他们会像这样:
<p>Some text</p>
{{widget type="pagelink" pageid="1"}}
<div class="whatever">Content</div>
我想知道最好的方法是什么,谢谢!
更新:背景
整体问题是我的Magento网站有很多静态链接,如:
<a href="/some/pageurl">Link text</a>
我需要将小部件替换为页面,以便在URL更改时更新链接。所以用这样的东西替换上面的内容。
{{widget type="Magento\Cms\Block\Widget\Page\Link" anchor_text="Link Text" template="widget/link/link_block.phtml" page_id="123"}}
我有一些使用PHP DOMDocument功能执行此操作的东西。它通过URL查找CMS页面,查找ID并使用窗口小部件文本替换锚点节点。如果页面不包含任何小部件或URL占位符,则此方法可以正常工作。
但是如果确实如此,那么当通过DOMDocument saveHTML()函数处理时占位符就会破碎。
我想解决这个问题的方法是在将小部件和URL占位符传递给DOMDocument loadHTML()函数之前对其进行编码,并在saveHTML()函数再次为字符串时对它们进行解码。
更新:代码
这是我目前所拥有的缩减版本。它很麻烦,但它确实可以用小部件替换页面。
$pageCollection = $this->pageCollectionFactory->create();
$collection = $pageCollection->load();
$findarray = array('http', 'mailto', '.pdf', '{', '}');
$findarray2 = array('mailto', '.pdf', '{', '}');
$specialurl = 'https://www.example.com';
$relative_links = 0;
$missing_pages = 0;
$fixed_links = 0;
try {
foreach ($collection as $page) {
$dom = new \DOMDocument();
$content = $this->cleanMagentoCode( $page->getContent() );
libxml_use_internal_errors(true); // Surpress warnings created by reading bad HTML
$dom->loadHTML( $content, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD ); // Load HTML without doctype or html containing elements
$elements = $dom->getElementsByTagName("a");
for ($i = $elements->length - 1; $i >= 0; $i --) {
$link = $elements->item($i);
$found = false;
// To clean up later
if ( strpos($link->getAttribute('href'), $specialurl) !== FALSE ) {
foreach ($findarray2 as $find) {
if (stripos($link->getAttribute('href'), $find) !== FALSE) {
$found = true;
break;
}
}
} else {
foreach ($findarray as $find) {
if (stripos($link->getAttribute('href'), $find) !== FALSE) {
$found = true;
break;
}
}
}
if ( strpos($link->getAttribute('href'), '#') === 0 ) {
$found = true;
}
if ( $link->getAttribute('href') == '' ) {
$found = true;
}
if ( !$found ) {
$url = parse_url($link->getAttribute('href'));
if ( isset( $url['path'] ) ) {
$identifier = rtrim( ltrim($url['path'], '/'), '/' );
try {
$pagelink = $this->pageRepository->getById($identifier);
// Fix link
if ($this->fixLinksFlag($input)) {
if ( stripos( $link->getAttribute('class'), "btn" ) !== FALSE ) {
$link_template = "widget/link/link_block.phtml";
} else {
$link_template = "widget/link/link_inline.phtml";
}
$widgetcode = '{{widget type="Magento\Cms\Block\Widget\Page\Link" anchor_text="' . $link->nodeValue . '" template="' . $link_template . '" page_id="' . $pagelink->getId() . '"}}';
$widget = $dom->createTextNode($widgetcode);
$link->parentNode->replaceChild($widget, $link);
}
}
}
}
}
$page->setContent( $this->dirtyMagentoCode( $dom->saveHTML() ) );
$page->save();
}
}