我是下面的函数,我在努力输出DOMDocument而没有在内容输出之前附加XML,HTML,body和p标签包装器.建议的修复:
$postarray['post_content'] = $d->saveXML($d->getElementsByTagName('p')->item(0));
Run Code Online (Sandbox Code Playgroud)
仅在内容中没有块级元素时才有效.但是,当它执行时,如下面的例子中的h1元素,saveXML的结果输出被截断为...
<p>如果你喜欢</ p>
我已经指出这篇文章可能是一种解决方法,但是我无法理解如何将它实现到这个解决方案中(参见下面的注释).
有什么建议?
function rseo_decorate_keyword($postarray) {
global $post;
$keyword = "Jasmine Tea"
$content = "If you like <h1>jasmine tea</h1> you will really like it with Jasmine Tea flavors. This is the last ocurrence of the phrase jasmine tea within the content. If there are other instances of the keyword jasmine tea within the text what happens to jasmine tea."
$d = new DOMDocument();
@$d->loadHTML($content);
$x = new DOMXpath($d);
$count = …Run Code Online (Sandbox Code Playgroud) 我想弄清楚如何获得
<title>A common title</title>
<meta name="keywords" content="Keywords blabla" />
<meta name="description" content="This is the description" />
Run Code Online (Sandbox Code Playgroud)
即使它以任何顺序排列,我也听说过PHP Simple HTML DOM Parser,但我真的不想使用它.除了使用PHP Simple HTML DOM Parser之外,是否可以使用解决方案.
preg_match 如果HTML无效,将无法执行此操作?
cURL可以用preg_match做这样的事吗?
Facebook做了类似这样的事情,但它通过使用正确使用:
<meta property="og:description" content="Description blabla" />
Run Code Online (Sandbox Code Playgroud)
我想要这样的东西,以便当有人发布链接时,它应该检索标题和元标记.如果没有元标记,那么它会被忽略或者用户可以自己设置(但我稍后会自己做).
有没有什么方法可以在没有内容编码的情况下将HTML模板插入现有DOMNode?
我试过这样做:
$dom->createElement('div', '<h1>Hello world</h1>');
$dom->createTextNode('<h1>Hello world</h1>');
Run Code Online (Sandbox Code Playgroud)
输出几乎相同,唯一的区别是第一个代码将它包装在div中.我试图从字符串加载HTML,但我不知道如何将它的正文内容附加到另一个DOMDocument.
在javascript中,这个过程看起来非常简单明了.
这是我的代码:
$oDom = new DOMDocument();
$oDom->loadHTML("èàéìòù");
echo $oDom->saveHTML();
Run Code Online (Sandbox Code Playgroud)
这是输出:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html><body><p>èà éìòù</p></body></html>
Run Code Online (Sandbox Code Playgroud)
我想要这个输出:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html><body><p>èàéìòù</p></body></html>
Run Code Online (Sandbox Code Playgroud)
我试过......
$oDom = new DomDocument('4.0', 'UTF-8');
Run Code Online (Sandbox Code Playgroud)
或1.0和其他东西,但没有.
另一件事......有一种方法可以获得相同的未触动的HTML?例如,输入中的html 使用DOMDocument <p>hello!</p>获取相同的输出,<p>hello!</p>仅用于解析DOM并在标记内进行一些替换.
我正在尝试使用DOMDocument解析HTML代码,对其进行更改,然后将其组合回我发送到输出的字符串.
但是有一些关于解析的问题,这意味着我发送给DOMDocument的内容并不总是以相同的形式返回:)
这是一个清单:
使用- > loadHTML:
preserveWhitespace和formatOutput设置如何(在预先格式化的文本上丢失空白)<header>,<footer>等,但它们可以supressed,这样我就可以用这个活.<link ... />元素(带有自闭标记),解析/ saveHTML后输出将是<link .. >使用- > loadXML:
>来自<style>或<script>标签的实体:body > div变成body > div<meta ... />变为<meta...></meta>; 但这可以用正则表达式修复.我没有尝试HTML5lib,但出于性能原因,我更喜欢DOMDocument而不是自定义解析器
就像使用CDATA提到的Honeymonster一样,修复了loadXML的主要问题.
有没有什么方法可以防止除了某个集合之外的所有空HTML标签的自动关闭,而不使用正则表达式?
现在我有:
$html = $dom->saveXML($node);
$html = preg_replace_callback('#<(\w+)([^>]*)\s*/>#s', function($matches){
// ignore only these tags
$xhtml_tags = array('br', 'hr', 'input', 'frame', 'img', …Run Code Online (Sandbox Code Playgroud) 我从其他地方搜索和处理XML文件,并需要使用一些XSLT转换它们.没问题.使用PHP5和DOM库,一切都很简单.工作得很好,到现在为止.今天,时髦的角色在XML文件中 - 来自Word的"智能"引用,它看起来像.无论如何,DOMDocument-> load抱怨他们,说他们不是UTF-8,并指定编码.
请注意,这些XML文件中未指定编码.如果我在标题中添加'encoding ="iso-8859-1"',它可以正常工作.问题是我无法控制这些XML文件.
将文件读入字符串,修改其标题并将其写回另一个位置似乎是我唯一的选择,但我更愿意这样做,而不必使用XML文件的临时副本.有没有办法简单地告诉解析器解析它们就好像它们是iso-8859-1一样?
以下函数旨在将rel="nofollow"属性应用于所有外部链接,而不是内部链接,除非该路径与$my_folder下面定义的预定义根URL匹配.
所以考虑到变量......
$my_folder = 'http://localhost/mytest/go/';
$blog_url = 'http://localhost/mytest';
Run Code Online (Sandbox Code Playgroud)
而内容......
<a href="http://localhost/mytest/">internal</a>
<a href="http://localhost/mytest/go/hostgator">internal cloaked link</a>
<a href="http://cnn.com">external</a>
Run Code Online (Sandbox Code Playgroud)
最终结果,更换后应该......
<a href="http://localhost/mytest/">internal</a>
<a href="http://localhost/mytest/go/hostgator" rel="nofollow">internal cloaked link</a>
<a href="http://cnn.com" rel="nofollow">external</a>
Run Code Online (Sandbox Code Playgroud)
请注意,第一个链接不会更改,因为它是一个内部链接.
第二行上的链接也是一个内部链接,但由于它匹配我们的$my_folder字符串,它nofollow也会得到.
第三个链接是最简单的,因为它与它不匹配blog_url,它显然是一个外部链接.
但是,在下面的脚本中,我的所有链接都已获得nofollow.如何修复脚本以执行我想要的操作?
function save_rseo_nofollow($content) {
$my_folder = $rseo['nofollow_folder'];
$blog_url = get_bloginfo('url');
preg_match_all('~<a.*>~isU',$content["post_content"],$matches);
for ( $i = 0; $i <= sizeof($matches[0]); $i++){
if ( !preg_match( '~nofollow~is',$matches[0][$i])
&& (preg_match('~' . $my_folder . '~', $matches[0][$i])
|| !preg_match( '~'.$blog_url.'~',$matches[0][$i]))){
$result = trim($matches[0][$i],">"); …Run Code Online (Sandbox Code Playgroud) 给这个参数的描述中,convmap为方法mb_encode_numericentity在PHP手册是含糊我。有人会帮助更好地解释这一点,或者如果它对我来说足够了,也许可以“把它放倒”?这个参数中使用的数组元素是什么意思?联机帮助页中的示例 1 具有
<?php
$convmap = array (
int start_code1, int end_code1, int offset1, int mask1,
int start_code2, int end_code2, int offset2, int mask2,
........
int start_codeN, int end_codeN, int offsetN, int maskN );
// Specify Unicode value for start_codeN and end_codeN
// Add offsetN to value and take bit-wise 'AND' with maskN, then
// it converts value to numeric string reference.
?>
Run Code Online (Sandbox Code Playgroud)
这是有帮助的,但后来我看到了很多使用示例,例如array(0x80, 0xffff, 0, 0xffff);让我失望。这是否意味着偏移量0和掩码将是0xffff,如果是这样,偏移量是否意味着开始转换的字符串中的字符数,mask …
我有 PHP 代码,它删除了至少具有一个属性的所有节点。这是我的代码:
<?php
$data = <<<DATA
<div>
<p>These line shall stay</p>
<p class="myclass">Remove this one</p>
<p>But keep this</p>
<div style="color: red">and this</div>
</div>
DATA;
$dom = new DOMDOcument();
$dom->loadHTML($data, LIBXML_HTML_NOIMPLIED);
$dom->removeChild($dom->doctype);
$xpath = new DOMXPath($dom);
$lines_to_be_removed = $xpath->query("//*[count(@*)>0]");
foreach ($lines_to_be_removed as $line) {
$line->parentNode->removeChild($line);
}
// just to check
echo $dom->saveHTML();
?>
Run Code Online (Sandbox Code Playgroud)
正如你在小提琴中看到的,这是上面代码的当前输出:
<div>
<p>These line shall stay</p>
<p>But keep this</p>
</div>
Run Code Online (Sandbox Code Playgroud)
虽然这是理想的结果:
<div>
<p>These line shall stay</p>
Remove this one
<p>But keep this</p>
and this
</div> …Run Code Online (Sandbox Code Playgroud) 我正在尝试获取DOMElementPHP 中 a 的内部 HTML。标记示例:
<div>...</div>
<div id="target"><p>Here's some <em>funny</em> text</p></div>
<div>...</div>
<div>...</div>
Run Code Online (Sandbox Code Playgroud)
将上面的字符串输入变量中$html,我正在做:
$doc = new DOMDocument();
@$doc->loadHTML("<html><body>$html</body></html>");
$node = $doc->getElementById('target')
$markup = '';
foreach ($node->childNodes as $child) {
$markup .= $child->ownerDocument->saveXML($child);
}
Run Code Online (Sandbox Code Playgroud)
生成的$markup字符串如下所示(转换为 JSON 以显示不可见字符):
"<p>Here's some \u00a0 <em>funny<\/em> \u00a0 text<\/p>"
Run Code Online (Sandbox Code Playgroud)
所有 字符都已转换为 Unicode 不间断空格,这会破坏我的应用程序。
在我的理想世界中,有一种方法可以按原样检索目标 div 内的原始 HTML 字符串,而无需DomDocument对其执行任何操作。这似乎不可能,所以下一个最好的办法是以某种方式关闭此字符转换。到目前为止我已经尝试过:
$doc->substituteEntities = false;没有结果。更改为true也没有帮助。$doc->preserveWhiteSpace方式均无变化saveXML为saveHTML. …php ×10
domdocument ×6
dom ×3
html ×2
collation ×1
curl ×1
html-encode ×1
html5 ×1
meta-tags ×1
preg-match ×1
regex ×1
title ×1
utf-8 ×1
xml ×1
xpath ×1