Don';t拆分连字符的单词


Don't split hyphenated words

我正在开发一个用葡萄牙语编写内容的网站(Wordpress、HTML、CSS、jQuery)。有很多带连字符的单词,如果它们出现在行尾,就会被一分为二。这里有一个例子:

Batata frita pála-
pála, é uma tara de
sabor.

有没有一种方法可以检测一个单词是否有连字符,而如果它在行尾,则不将其一分为二?理想的情况是整个单词都转到下一行,但如果不可能,我愿意接受建议。类似这样的东西:

Batata frita
pála-pála, é uma
uma tara de sabor.

对我来说,比知道解决方案更重要的是理解它。提前谢谢。

编辑

该网站是在CMS平台上开发的,内容由客户端插入,并且是动态的。我不能指望客户端自己使用不间断的连字符(HTML ‑)。

将所有连字符替换为不间断连字符。它与不间断空格( )相同,只是它是一个连字符。

如果你谈论的是浏览器自己对文本/HTML内容的包装(而不是正则表达式拆分),我可以想出两种方法:

  • 使用不间断的连字符(HTML ‑)而不是常规连字符
  • 在不想换行的部分周围添加<span style="white-space: nowrap">

正如其他人所建议的,您需要用不间断的连字符替换常规连字符。

这可以由CMS自动完成。

对于Wordpress,您可以在主题的functions.php中添加一个内容过滤器:

function non_breaking_hyphens($content){
    return str_replace('-', '&#8209;', $content);
}
add_filter('the_content', 'non_breaking_hyphens');

这将在邮件发送到浏览器之前,在邮件正文上应用所需的搜索替换。

有几种可能性:

<nobr>pála-pála</nobr>
<span class=nobr>pála-pála</span>
pála&#8209;pála

各有利弊(请参阅http://www.cs.tut.fi/~jkorpela/html/nobr.html)。

无论您选择哪种方法,都可以尝试在服务器端或客户端自动化流程。由于这或多或少是一种表现形式,我认为它可以用客户端JavaScript来完成。我建议采用一种类似于Firefox的策略:长连字符的复合词可以进行分割(这通常可以改进格式),但如果连字符两侧的字符少于4个,则可以防止分割。

关于问题中的更新:

我看到了三种可能的解决方案,但不是简单的一种:)

  1. 使用regex解析内容,如果子字符串在>....<中,则使用str_replace或在<nobr>中换行=>容易出错且复杂
  2. 使用内容构建DOMDocument,遍历DOM,并使用您选择的非中断解决方案处理每个textNode。=>服务器资源可能很昂贵
  3. 客户端:我看到的大多数所见即所得都有用于扩展的API。添加一个插入不间断连字符的按钮,或者添加一个用&#8209;替换-的onKeyUp侦听器

如果你因为在iOS移动浏览器中查看网站而面临这一挑战,你必须制定更有力的代码。例如,苹果iPhone将回流文本,但也可以自行断字。因此,这样做可以完全消除问题:

.yourclass{
    -moz-hyphens: none;
    -ms-hyphens: none;
    -webkit-hyphens: none;
    hyphens: none;
}