【问题标题】:Make text content between specified HTML tags toUpperCase in React-Native在 React-Native 中将指定 HTML 标记之间的文本内容设置为大写
【发布时间】:2016-11-11 22:45:57
【问题描述】:

我想在 React-Native 应用程序中使用纯 JavaScript 将特定 HTML 标记的内容大写。

注意:这是一个 React-Native 应用程序。没有可用的 JS document,也没有 jQuery。同样,不能使用 CSS text-transform: uppercase,因为它不会显示在网络浏览器中。

假设有以下 HTML 文本:

<p>This is an <mytag>simple Example</mytag></p>

标签&lt;mytag&gt;的内容需转为大写:

<p>This is an <mytag>SIMPLE EXAMPLE</mytag></p>

我试过这段代码:

let regEx = storyText.match(/<mytag>(.*?)<\/mytag>/g)
if(regEx) storyText = regEx.map(function(val){
  return val.toUpperCase();
});

map() 函数只返回匹配的内容,而不是带有&lt;mytag&gt; 转换部分的整个字符串变量。

此外,如果未找到标记,match() 方法将返回 null。所以像storyText.match().doSomething 这样流畅的编程风格是不可能的。

由于要转换的标签更多,因此我可以将变量传递给正则表达式模式的方法将不胜感激。

有什么提示可以解决这个问题吗?

(此代码在带有 react-native-html-view Plugin 的 React-Native-App 中使用,它不支持开箱即用的 text-transform。)

【问题讨论】:

  • "transform content between Html-Tags to upperCacse" , "但是map-function只返回匹配的内容而不是整个字符串变量和转换后的部分." 原始问题似乎需要将mytag 的内容设置为大写,而不是标签和内容?
  • 是否需要将&lt;mytag&gt;&lt;mytag&gt; 文本内容设置为大写?您可以在问题中包含预期结果的文本吗?
  • react-native-html-view 似乎包含一个复杂的 HTML 解析器。没办法,你能上钩吗?

标签: javascript html react-native ecmascript-6 ecmascript-5


【解决方案1】:

由于似乎 document 和 DOM 操作(例如,通过 jQuery 和本机 JS document 函数)是不受限制的,我猜你必须使用正则表达式。

那为什么不直接创建一个函数来完成上述工作:遍历每个标签并通过正则表达式替换它?

var storyText = "your HTML in a string";
function tagsToUppercase(tags) {
  for(tag in tags) {
    let regex = new RegExp("(<" + tags[tag] + ">)([^<]+)(<\/" + tags[tag] + ">)", "g");
    storyText = storyText.replace(regex, function(match, g1, g2, g3) {
      return g1 + g2.toUpperCase() + g3;
    });
  }
}

// uppercase all <div>, <p>, <span> for example
tagsToUppercase(["div", "p", "span"]);

JSFiddle 上查看它。


另外,虽然它可能不适用于这种情况,(@Bergi 敦促我提醒你) 尝试avoid using regular expressions to manipulate the DOM

【讨论】:

  • for 循环中有隐式全局变量。
  • "document" 在 React-Native-Application 中不受支持
  • 我不知道你为什么要浏览解释为什么使用正则表达式是个坏主意的链接?
  • @Bergi 因为 DOM 操作是不可能的,我想我必须使用正则表达式和违抗链接。就一次。 (对不起。)
  • 等等,如果没有 DOM,你将如何渲染 HTML?不,即使您无权访问 DOM,使用 Regex 操作 HTML 也是一个坏主意,它不会使链接无效。
【解决方案2】:

编辑、更新

标签的内容要转成大写:

&lt;p&gt;This is an &lt;mytag&gt;SIMPLE EXAMPLE&lt;/mytag&gt;&lt;/p&gt;

您可以使用String.prototype.replace()RegExp /(&lt;mytag&gt;)(.*?)(&lt;\/mytag&gt;)/g 来创建三个捕获组,在第二个捕获组上调用.toUpperCase()

let storyText = "<p>This is an <mytag>simple Example</mytag></p>";
let regEx = storyText.replace(/(<mytag>)(.*?)(<\/mytag>)/g
, function(val, p1, p2, p3) {
  return p1 + p2.toUpperCase() + p3
});

console.log(regEx);

【讨论】:

  • 这段代码省略了mytag-tag前后的部分
  • 结果应该是""

    这是一个简单示例

    ";"
  • @itinance "结果应该是""

    这是一个简单示例

    ";""考虑包括这个问题中预期结果的描述?
【解决方案3】:

一般来说,您不应该使用 javascript 解析 html。考虑到这一点,如果这是您真正需要做的事情,请尝试以下操作:

let story = '<p>smallcaps</p><h1>heading</h1><div>div</div><p>stuff</p>';
console.log( story.replace(/<(p|span|div)>([^<]*)<\/(p|span|div)>/ig,
    (fullmatch, startag,content,endtag) =>  `<${startag}>${content.toUpperCase()}</${endtag}>` )
)

考虑在div 内可能有嵌套值的情况,pastrongemp 内。对于这些情况,这是行不通的。

【讨论】:

    【解决方案4】:

    为什么不这样呢?

    $("mytag").text($("mytag").text().toUpperCase())
    

    https://jsfiddle.net/gub61haL/

    【讨论】:

    • 由于是 react native 应用,所以没有 jquery 可用
    猜你喜欢
    • 1970-01-01
    • 2021-09-27
    • 1970-01-01
    • 2012-12-20
    • 2023-03-14
    • 1970-01-01
    • 2018-11-13
    • 2019-06-24
    • 1970-01-01
    相关资源
    最近更新 更多