PHP编码字符串的一部分然后解码

时间:2018-01-20 13:17:54

标签: php html regex dom magento2

我有一个包含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();
    }
}

0 个答案:

没有答案