如何在 React-Native Webview 的注入 JavaScript 道具中使用 RegExp?

Posted

技术标签:

【中文标题】如何在 React-Native Webview 的注入 JavaScript 道具中使用 RegExp?【英文标题】:How to use RegExp in React-Native Webview's injectedJavaScript prop? 【发布时间】:2020-03-29 05:12:08 【问题描述】:

当我在 React-Native-Webview 的注入 javascript 属性中使用 regexp 时,会抛出错误 Unterminated regular expression literal error 并且不会使用 regexp。

我应该如何在注入的 JavaScript 中使用正则表达式? 如果没有,我可以使用解决方法吗?

最小可重现代码如下:

// this won't work
<WebView
  source= uri: 'https://github.com/ashi009/node-fast-html-parser' 
  injectedJavaScript=`const regE = /\n|\r/`
/>

// this won't work as well
<WebView
  source= uri: 'https://github.com/ashi009/node-fast-html-parser' 
  injectedJavaScript=`const regE = new RegExp(/\n|\r/);`
/>

// this will work
<WebView
  source= uri: 'https://github.com/ashi009/node-fast-html-parser' 
  injectedJavaScript=`const regE = /A*B*C*/`
/>
操作系统:ios 操作系统版本:13.3.1 react-native 版本:0.61.2 react-native-webview 版本:8.1.2

也检查下面的错误屏幕。

完整的错误信息:

评估注入的JavaScript 时出错:这可能是由于返回类型不受支持。尝试将 true 添加到注入的 JavaScript 字符串的末尾。错误域=WKErrorDomain 代码=4“发生 JavaScript 异常”UserInfo=WKJavaScriptExceptionLineNumber=1, WKJavaScriptExceptionMessage=SyntaxError: 未终止的正则表达式文字'/', WKJavaScriptExceptionColumnNumber=0, WKJavaScriptExceptionSourceURL=https://github.com/ashi009/node-fast-html-parser, NSLocalizedDescription=发生 JavaScript 异常

【问题讨论】:

可能是转义字符问题 您能详细说明一下吗? 疯狂猜测。尝试一个没有反斜杠的模式,看看它是否编译。也可以在声明的最后加上; 我可以使用没有反斜杠的模式而不会出错。谢谢!但我确实需要有反斜杠的模式。那我该怎么办? 听起来它在 webview 中被解释为转义字符或其他东西,因此在模式中单个反斜杠是不够的。尝试双转义反斜杠,它可能会起作用:/\\n|\\r/; 【参考方案1】:

您不是在编写普通的 Javascript - 您是在 webview 中编写 Javascript,首先必须通过它评估您的语法。要在 injectedJavaScript 中使用文字反斜杠(例如,对于 \r),请改为使用两个反斜杠 (\\r):

injectedJavaScript=`const regE = new RegExp(/\\n|\\r/);`

我认为

<WebView
  source= uri: 'https://github.com/ashi009/node-fast-html-parser' 
  injectedJavaScript=`const regE = new RegExp(/\n|\r/);`
/>

将字符串文字中的\n 作为代码中的换行符,相当于:

<WebView
  source= uri: 'https://github.com/ashi009/node-fast-html-parser' 
  injectedJavaScript=`const regE = new RegExp(/
|\r/);`
/>

\r 也是如此)。但正则表达式文字中不允许换行。

【讨论】:

以上是关于如何在 React-Native Webview 的注入 JavaScript 道具中使用 RegExp?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 WebView [React-Native] 中禁用用户文本选择

如何在没有 webview 的情况下将 vimeo 播放器嵌入 react-native?

如何在WebView中禁用用户文本选择[React-Native]

如何在 react-native webView 和 React web-app 之间进行通信?

如何在 Detox 中控制 React-Native webview?

如何在 React-Native Webview 的注入 JavaScript 道具中使用 RegExp?