如何防止简单的HTML DOM明文将连续的单词连接在一起,用于顺序<div>元素

时间:2016-12-20 16:14:29

标签: php simple-html-dom

我正在解析包含以下摘录的网页:

<div>foo</div><div>bar</div>

使用以下代码:

$html = file_get_html("http://example.com");
$pt = $html->plaintext;
echo $pt;

$pt返回&#34; foobar&#34;。我想要的是&#34; foo bar&#34;,即在单独元素中的单词之间添加空格。

<div>之外还有其他元素我看到了这种行为,因此解决方案必须是可以包含可查看文本的所有元素类型的通用。

有没有办法操纵$html对象在元素之间添加空格,或者plaintext在找到的每个单词后添加空格?我可以处理结果$pt中的双倍空格。

我尝试$html = str_replace ( "</" , " </" , $html );,但结果为空,可能是因为我试图编辑对象而不是字符串,然后对象被破坏了。

更新

根据一些反馈,我尝试了以下内容:

$webString = file_get_contents("http://example.com");
$webString = str_replace ( "</" , " </" , $webString );  // add a space before all <tag> closures.

$html = new simple_html_dom();
$html->load($webString);

$pt = $html->plaintext;
echo $pt;

这有理想的结果,但我不知道是否有更有效的方法。

4 个答案:

答案 0 :(得分:1)

当你使用明文方法时,它会被连接起来。以下内容应该为您提供一个div数组。

$html = file_get_html("http://example.com");
$pt = $html->find('div');
print_r($pt); 

答案 1 :(得分:1)

我遇到了这个问题,我想以粗体显示纯文本,并且遇到了污染问题,只需执行以下操作即可: 首先,找到所有粗体文本并将其存储在数组中 接下来,获取所需元素的内部文本 最后,剥离标签(仅对我而言的另一步是将此处的文本替换为粗体数组中的所有文本)

$elements = $html->find('p');
foreach ($elements as $key => $element) {
        $text = $element->innertext;
        $text = strip_tags($text);
        // one extra step for me only I replace bold texts
}

答案 2 :(得分:0)

如果您使用file_get_contents获取字符串而不是HTML的对象,则可以使用preg_match_all获取所有div标记,然后使用{strip_tagsarray_walk应用于每个匹配的标记{1}}给你留下价值。

试试这个:

$str = file_get_contents("some_file_with_your_html.php");
// Assume the above returns something like the below
$str = "<div>sdsd</div><div id='some_id_1' attribute>test</div><div><div>inside</div></div><div><h1>header</h1></div><p>sdscdsds</p><div>another</div>";

// matches all div tags with any optional attributes and CSS declarations
$tagsFound = preg_match_all("|<div([^>]?)+>(.*)</div+>|U", $str, $matches);
if ((bool)$tagsFound !== false) {
    // Apply the anonymous function to each array value
    array_walk($matches[0], function (&$value, $index) {
        $value = strip_tags($value);
    });
}

这将为您提供HTML中的文本数组:

print ('<pre>');
print_r($matches[0]);
print ('</pre>');

Array
    (
        [0] => sdsd
        [1] => test
        [2] => inside
        [3] => header
        [4] => another
    )
    

然后,如果需要,您可以在结果数组上对implode进行分隔,以便用空格分隔。

参考文献:

http://be2.php.net/manual/en/function.preg-match-all.php

http://be2.php.net/manual/en/function.array-walk.php

http://be2.php.net/manual/en/function.strip-tags.php

http://php.net/manual/en/pcre.pattern.php

答案 3 :(得分:0)

因为您无法确定哪些元素会为@Test public void testCipherGetInstanceShouldDefaultToECB() throws Exception { // Arrange final String PLAINTEXT = "This is a plaintext message." final SecretKey key = new SecretKeySpec(Hex.decodeHex("0123456789ABCDEFFEDCBA9876543210" as char[]), "AES") Cipher unspecified = Cipher.getInstance("AES") final Cipher EXPECTED_CIPHER = Cipher.getInstance("AES/ECB/PKCS5Padding") unspecified.init(Cipher.ENCRYPT_MODE, key) EXPECTED_CIPHER.init(Cipher.DECRYPT_MODE, key) // Act byte[] cipherBytes = unspecified.doFinal(PLAINTEXT.getBytes(StandardCharsets.UTF_8)) logger.info("Cipher text: ${Hex.encodeHexString(cipherBytes)}") // Assert byte[] recoveredBytes = EXPECTED_CIPHER.doFinal(cipherBytes) String recovered = new String(recoveredBytes, StandardCharsets.UTF_8) assert recovered == PLAINTEXT } 生成结果,所以如果您将整个页面作为字符串读取,则可以在每个元素之前添加 func downloadPostsFromFirebase(withValue: String) { // 1 - Get a reference to the database ref = FIRDatabase.database().reference(withPath: "items-for-sale") var startKey = withValue var count = GlobalConstants.FirebaseConstants.numerOfPostsPerPage var query = ref.queryOrderedByKey() if startKey != nil { query = query.queryEnding(atValue: startKey) count += 1 } query.queryLimited(toLast: UInt(count)).observeSingleEvent(of: .value, with: { snapshot in guard var children = snapshot.children.allObjects as? [FIRDataSnapshot] else { // Handle error return } if startKey != nil && !children.isEmpty { // TODO - If the number of items in the array is equal to the number of items in the db now, then stop? for child in snapshot.children { // instance of ItemForSale, it's added to the array that contains the latest version of the data. let itemForSaleSingle = ItemForSale(snapshot: child as! FIRDataSnapshot) startKey = itemForSaleSingle.key self.items.append(itemForSaleSingle) print("Total items count is \(self.items.count)") self.collectionView?.reloadData() print("start key is \(startKey)") } } }) } 以添加空格标签关闭字符。 (plaintext

此处的其他建议答案取决于知道哪些元素包含可读文本,但这不是提前知道的。

这似乎产生了预期的效果:

str_replace