【问题标题】:How to force breaking of non breakable strings?如何强制断开不可断裂的字符串?
【发布时间】:2010-12-03 11:31:18
【问题描述】:

我有一个从数据库中包含的数据生成的 HTML 页面。数据库有时包含浏览器无法破解的长字符串,因为这些字符串不包含可破解字符(空格、点、逗号等)。

有没有办法使用 html、css 甚至 javascript 来解决这个问题?

有关问题的示例,请参阅此link

【问题讨论】:

标签: javascript html css


【解决方案1】:

也可以使用 word-break css 属性来剪切元素边缘的每个字。

.selector_name {
  word-break: break-all;
}

<p class="selector_name">some words some words some words some words</p>

you can obtain:
some word|
s some wo|<-edge of the element
rds some |
words som|
e words  |

【讨论】:

    【解决方案2】:

    使用&amp;shy; 和上面的解决方案的问题是一个额外的字符仍然存在,并且通过复制/粘贴操作(即使是纯文本)它会出现。

    我会使用不可见且在复制时不考虑的标签&lt;wbr&gt;

    例如,要让电子邮件地址分成两行(仅当空间不足时)我使用这个:

    echo str_replace( "@","<wbr>@", $email );
    

    结果如下:

    name.surname
    @website.com
    

    【讨论】:

    【解决方案3】:

    基于this articlethis one as well:“害羞连字符”或“软连字符”可以用 HTML 编写为:&amp;shy;/&amp;#173;/&amp;#xAD(173 dec = AD hex)。它们都转换为 U+00AD 字符。

    DOM 文本节点的 JavaScript textContentnodeValue 不是“实体编码” - 它们只包含实际实体。因此,为了编写这些字符,您必须自己对它们进行编码:\xAD 是在 JavaScript 字符串中写入相同字符的简单方法。 String.fromCharCode(173) 也可以。

    基于您自己的非常好的答案 - 一个 jQuery 插件版本:

    $.fn.replaceInText = function(oldText, newText) {
      // contents() gets all child dom nodes -- each lets us operate on them
      this.contents().each(function() {
        if (this.nodeType == 3) { // text node found, do the replacement
            if (this.textContent) {
                this.textContent = this.textContent.replace(oldText, newText);
            } else { // support to IE
                this.nodeValue = this.nodeValue.replace(oldText, newText);
            }
        } else {
          // other types of nodes - scan them for same replace
          $(this).replaceInText(oldText, newText);
        }
      });
      return this;
    };
    
    $(function() {
        $('div').replaceInText(/\w{10}/g, "$&\xAD");
    });
    

    附注:

    我认为这不应该出现在 JavaScript 中——它应该出现在服务器端代码中。如果这只是一个用于显示数据的页面 - 您可以在将文本发送到浏览器之前轻松地对文本进行类似的正则表达式替换。然而,JavaScript 解决方案提供了一个优势(或劣势,取决于您如何看待它) - 在脚本执行之前,它不会向数据添加任何无关字符,这意味着任何爬取您的 HTML 输出以获取数据的机器人都不会看到害羞的连字符。尽管 HTML 规范将其解释为“连字符提示”和不可见字符,但在 Unicode 世界的其他地方并不能保证:(通过我链接的第二篇文章引用 Unicode 标准)

    U+00AD 软连字符表示 断字点,换行符 当一个词是首选 连字符。根据脚本, 这个的可见渲染 发生换行时的字符可能 不同(例如,在某些脚本中 它呈现为连字符 -,而在 其他人可能是不可见的)。

    另一个注意事项:this other SO Question 中找到 - 似乎“Zero Width Space”字符 &amp;#8203; / &amp;#x200b; / U+200b 是您可能想要探索的另一个选项。它将是 \x20\x0b 作为 javascript 字符串。

    【讨论】:

    • @gnarf:非常感谢!!数据将以 json 格式来自 ajax 调用。我的服务与 UI 无关;它只是返回数据。这就是为什么我想在客户端解决这个问题。毕竟这只是一个补丁,直到浏览器为 CSS3 word-warp 属性提供更好的支持。
    【解决方案4】:

    可以,只需将框的 css 属性设置为:

    .some_selector {
        word-wrap: break-word;
    }
    

    编辑:一些测试表明它确实适用于 div 或 ap - 一个块级元素 - 但它不适用于表格单元格,也不能将 div 放在表格单元格中.

    IE6IE7IE8Firefox 3.5.3Chrome 中测试并运行

    作品:

    <div style="word-wrap: break-word">aaaaaaaaaaaaaaaaaaaaaaddddddddddddddddddddddddddddddddddddddddddaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa </div>
    

    【讨论】:

    • 除非我做错了什么,否则添加自动换行无效(firefox/IE)。我的 HMTL 编辑器 (Visual Studio) 告诉我这不是有效的 CSS 属性名称。
    • 我刚刚在这里尝试过,所以在 firebug 中添加了一堆 x,它可以在 Firefox 3.5 中使用。它也应该在 IE 中工作;我认为它曾经是一个仅限 IE 的属性。
    • 我刚刚升级到 Firefox 3.5.3。 TD 中的 DIV 在 3.5 中不起作用。
    • 这很奇怪,当我在 Windows XP 中测试时,结果如我的答案所示,当我在 Windows 7 RC 中检查时,表格解决方案在 Firefox 和 Chrome 中都不起作用。我想你必须避免使用表格......
    • "word-wrap: break-word" 在较旧的非 MSIE 浏览器上不受支持,但您可以将其与 "overflow: hidden" 配对以截断可用空间末尾的长单词适用于无法识别“自动换行”设置并提供(相对)完整的纯 CSS 解决方案的浏览器。
    【解决方案5】:

    在将长词添加到文档之前,将它们从文本字符串中拆分出来更容易。

    最好避免孤儿,因为最后一行只有一两个字符。

    此方法将在长度超过 n 的每个未加空格的字符中插入空格, 拆分它,使最后一行至少有 min 个字符。

    function breakwords(text, n, min){
     var L= text.length;
     n= n || 20;
     min= min || 2;
     while(L%n && L%n<min)--n;
     var Rx= RegExp('(\\w{'+n+',}?)','g');
     text= text.replace(Rx,'$1 ');
     return text;
    }
    

    //测试

    var n=30, min=5;

    var txt= 'abcdefghijklmnopqrstuvwxyz0123456789 abcdefghijklmnopqrstuvwxyz012345678 abcdefghijklmnopqrstuvwxyz01234567 abcdefghijklmnopqrstuvwxyz0123456';

    txt=txt.replace(/(\w{30,})/g,function(w){return breakwords(w,n,min)});

    alert(txt.replace(/ +/g,'\n'))

    /*  returned value: (String)
    abcdefghijklmnopqrstuvwxyz0123
    456789
    abcdefghijklmnopqrstuvwxyz0123
    45678
    abcdefghijklmnopqrstuvwxyz012
    34567
    abcdefghijklmnopqrstuvwxyz01
    23456
    */
    

    【讨论】:

      【解决方案6】:

      我在这里回答我自己的问题...

      根据您的回答,我想出了这个解决方案(感谢@CMS in this question 的帮助)。

      此脚本通过在第 31 位插入空格来中断任何超过 30 个字符的单词。

      这里是固定版本:link

      我还有一个问题,我宁愿插入一个&amp;shy;,然后插入一个空格。但是分配node.nodeValuenode.textContent 会导致插入文本&amp;shy; 而不是标签。

      <script type="text/javascript">
      
          $(function() {
              replaceText(/\w{30}/g, "$& ", document.body);
          });
      
          function replaceText(oldText, newText, node) {
              node = node || document.body; // base node 
      
              var childs = node.childNodes, i = 0;
      
              while (node = childs[i]) {
                  if (node.nodeType == 3) { // text node found, do the replacement
                      if (node.textContent) {
                          node.textContent = node.textContent.replace(oldText, newText);
                      } else { // support to IE
                          node.nodeValue = node.nodeValue.replace(oldText, newText);
                      }
                  } else { // not a text mode, look forward
                      replaceText(oldText, newText, node);
                  }
                  i++;
              }
          }
      
      </script>
      

      如果有人想出更简单的解决方案,我会等几天再接受这个答案。

      谢谢

      【讨论】:

      • 将您的“空格”更改为\xAD- 替换字符串变为"$&amp;\xAD" - 然后您就有了害羞的连字符
      • 另外——基于它的工作方式——我写了一个小的 jQuery 插件。
      • 酷,插件是我的下一步!也感谢您修复害羞。你能解释一下\xAD 的语法吗?谢谢!
      • 我的答案已更新,以包含您要求的信息(我希望)-尽管我们应该将评论线程移至该答案;)
      【解决方案7】:

      有特殊字符 &amp;#173;&amp;shy; 可以做到这一点。 例如:

      Dzie&#173;le&#173;nie wy&#173;ra&#173;zów
      

      可能显示如下:

       1. dzie
       2. le
       3. nie wy
       5. ra
       6. zow
      

      【讨论】:

        【解决方案8】:

        您可以使用 jQuery 来实现,但是如何:让我稍微解释一下。首先,您需要添加引用,并且有一个插件可以帮助您:Read More Plugin - JQuery 但是您需要在获取阶段穿透您的代码。此时,您可以在 HttpHandler 或 Page_PreInit 阶段处理此问题,但如果没有任何服务器端代码,它一定很困难,或者可能没有任何办法。我不知道,但您应该能够在您的数据库获取的 html 页面中添加一些内容。

        【讨论】:

          【解决方案9】:

          正如已经多次指出的那样,不,如果不在显示字符串之前以编程方式预处理字符串,您将无能为力。

          我知道有一种策略可以在需要的地方插入软连字符 (&amp;shy;),但似乎不是一个流行的选项。

          看看这个问题:Soft hyphen in HTML ( vs. ­)

          【讨论】:

            猜你喜欢
            • 2019-03-20
            • 1970-01-01
            • 2015-05-23
            • 2021-10-28
            • 1970-01-01
            • 1970-01-01
            • 2010-09-09
            • 1970-01-01
            • 2017-10-20
            相关资源
            最近更新 更多