【问题标题】:Color a text string before and after a specific character在特定字符之前和之后为文本字符串着色
【发布时间】:2012-09-18 09:27:45
【问题描述】:

由于输出方式的原因,我有一些数据只能以特定方式排序。

我有一个表格,其中包含如下文本字符串

MyTextString_MyTextString
MyTextString_MyTextString
MyTextString_MyTextString

为了使其更具可读性,我希望将_ 之前的文本着色为红色,将_ 之后的文本着色为蓝色。这可以用 jquery 或 php 实现吗?

我尝试过诸如$('.myElement').find('_').css('color','red); 之类的方法,但认为这不是正确的方法。

是否可以只执行一次,例如如果有另一个文本字符串,它将保持第二种颜色,蓝色?即 Red_Blue_Blue_Blue(计数 = 1?)

标记示例。

<td class="myTextString1">
    MyTextString_MyTextString1
    <br/>
    MyTextString_MyTextString2
    <br/>
    MyTextString_MyTextString3
</p>

【问题讨论】:

  • 您能否展示一个您正在使用的标记的实际示例?

标签: php javascript jquery text


【解决方案1】:

我做了一个小提琴来展示(在我看来)一个很好的方法来做到这一点。 Here is the fiddle

有两个插件,一个扩展 String.prototype,另一个扩展 jQuery.fn。通过这种方式,您可以从字符串和元素中调用“.colorize()”。我在小提琴中包含了一些示例。

String.prototype.colorize = function () {
    var regex = new RegExp('[^_]+', 'gi'),
        color = $.extend(['blue', 'red'], arguments || []),
        index = 0;    

    return this.replace(regex, function(matched) {
        return '<span style="color: ' + color[index++] + ';">' + matched + '</span>';
    });
}

$.fn.colorize = function () {
    var args = arguments;

    return this.each(function () {
        this.innerHTML = this.innerHTML.colorize
            .apply(this.innerHTML, args);
    });
}

希望这会有所帮助!

【讨论】:

  • 这看起来是一个非常优雅的解决方案。我们可以在每个
    之后重复该功能还是不可能?小提琴 -> jsfiddle.net/gTZH2/6
  • 是的,你可以!一个简单的解决方案是将文本包装在跨度中。小提琴 -> jsfiddle.net/gTZH2/11
  • 遗憾的是我无法访问实际的标记,这是一个笑话 - 我知道。 :[
  • 感谢您抽空克里斯托弗。
【解决方案2】:

js:

var colorize = function(text) {
  var delimiter = "_",
      parts = text.split(delimiter),
      firstPart = $("<span>", { class: 'red', html: parts[0] }),
      secondPart = $("<span>", { class: 'blue', html: text.split(parts[0] + delimiter)[1] });

  return $("<div>").append(firstPart).append(delimiter).append(secondPart).html();
}

编辑:你也可以使用一个辅助函数来接收像这样的 jQuery 元素:

var colorizeElements = function($elements) {
  // $elements has to be something like $("td.classname")
  $elements.each(function() {
    $(this).html(colorize($(this).html()));
  });
};

编辑:工作 jsFiddle:http://jsfiddle.net/tGV54/1/

编辑:基于 Kristoffers 代码:

String.prototype.colorize = function () {
    var regex = new RegExp('[^_]+', 'gi'),
        color = $.extend(['blue', 'red'], arguments || []),
        index = 0;

    return this.replace(regex, function(matched) {
        return '<span style="color: ' + color[index++] + ';">' + matched + '</span>';
    });
};

$.fn.customColorize = function () {
    var args = arguments,
        delimiter = "<br>";

    return this.each(function () {
        var splitetElements = $.map(this.innerHTML.split(delimiter), function(s) { return s.colorize(); });
        this.innerHTML = splitetElements.join(delimiter);
    });
};

【讨论】:

  • 如何将其分配给 TD.ClassName? :)
  • 抱歉让你感到困惑...我做了一个 jsFiddle 在这里实际上可以工作 jsfiddle.net/tGV54/1 :)
  • 这真的很好,但我需要在
    之后这样做(小提琴:jsfiddle.net/gTZH2/6)。我知道,这不是我的标记,我无法控制它;((
  • 在为单个部分着色之前,我将 Kristoffers 插件更改为按
    分割。虽然我重命名了该函数(直到现在它很简单干净,但现在从名称中不清楚该函数究竟会做什么。我想知道他会怎么做)。 jsfiddle.net/gTZH2/7
【解决方案3】:

PHP:

$stringParts = explode( '_', 'MyTextString_MyTextString' );
$stringParts[0] = sprintf( '<span style="color: #f00;">%s</span>', $stringParts[0] );
if( count( $stringParts ) > 1 )
{
    $stringParts[1] = sprintf( '<span style="color: #00f;">%s</span>', $stringParts[1] );
    /* …or whatever */
}
echo implode( '_', $stringParts );

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-10
    • 1970-01-01
    • 2022-01-09
    相关资源
    最近更新 更多