我试图确定某些单词在 html 块中的绝对位置,但前提是它们在实际的 html 标记之外。例如,如果我想在本文中使用 preg_match 确定单词“join”的位置:
<p>There are 14 more days until our <a href="/somepage.html" target="_blank" rel="noreferrer noopener" aria-label="join us">holiday special</a> so come join us!</p>
我可以使用:
preg_match('/join/', $post_content, $matches, PREG_OFFSET_CAPTURE, $offset);
问题是这是在匹配 aria-label 属性中的词,而我需要的是紧接在链接之后的词。可以在<a>和之间进行匹配</a>,只是不在括号内。
我的实际最终目标是(我认为)除了最后一个元素之外的大部分内容:我正在修剪一个 html 块(不是完整的文档)以在特定的字数处截断。我试图确定最后一个单词以哪个字符结尾,然后将 html 块的左侧与右侧的 html 连接起来,因此所有 html 标签都可以优雅地关闭。我以为我让它工作了,直到我遇到一个例子,比如我展示了最后一个词也在 html 属性中,导致我在错误的位置拆分字符串。到目前为止,这是我的代码:
$post_content = strip_tags ( $p->post_content, "<a><br><p><ul><li>" );
$post_content_stripped = strip_tags ( $p->post_content );
$post_content_stripped = preg_replace("/[^A-Za-z0-9 ]/", ' ', $post_content_stripped);
$post_content_stripped = preg_replace("/\s+/", ' ', $post_content_stripped);
$post_content_stripped_array = explode ( " " , trim($post_content_stripped) );
$excerpt_wordcount = count( $post_content_stripped_array );
$cutpos = 0;
while($excerpt_wordcount>48){
$thiswordrev = "/" . strrev($post_content_stripped_array[$excerpt_wordcount - 1]) . "/";
preg_match($thiswordrev, strrev($post_content), $matches, PREG_OFFSET_CAPTURE, $cutpos);
$cutpos = $matches[0][1] + (strlen($thiswordrev) - 2);
array_pop($post_content_stripped_array);
$excerpt_wordcount = count( $post_content_stripped_array );
}
if($pwordcount>$excerpt_wordcount){
preg_match_all('/<\/?[^>]*>/', substr( $post_content, strlen($post_content) - $cutpos ), $closetags_result);
$excerpt_closetags = "" . $closetags_result[0][0];
$post_excerpt = substr( $post_content, 0, strlen($post_content) - $cutpos ) . $excerpt_closetags;
}else{
$post_excerpt = $post_content;
}
但是在执行 preg_match 之前翻转所有括号很容易,或者我假设应该很容易让 preg_match 考虑到这一点。
慕容3067478
喵喵时光机