我正在解析包含以下摘录的网页:
<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;
这有理想的结果,但我不知道是否有更有效的方法。
答案 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_tags
将array_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
答案 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